2010-05-05 90 views
5

我试图找到编写PHP的最佳实践。PHP和编写干净的代码

我只是想知道这是一个坏习惯。

例如,处理变量。

$var = 1 
$var = doSomething($var); 
$var = doSomething2($var); 
$var = doSomething3($var); 

它看起来有点可怕。

这里是一个真正的代码,我只是做了一个例子:

$this->rSum = explode(",", $this->options["rSum"]); 
$this->rSum = array_combine(array_values($this->rSum), array_fill(0, count($this->rSum), 0)); 

如果有人能超过我写干净的代码的一些好的教程通常这将是很好!

它再次问我愚蠢的问题。 :)


顺便说..

能有多少自动处理模式?

我有一个具有执行方法的模型,当我叫它,它做了很多事情就像读一本定义文件,使数据库查询。

例如

$object = new Object() 
$object->setFile("example.txt"); 
$object->execute(); 

// Then i can fetch things from it 
echo $object->getName(); 

回答

3

我真的很喜欢你的(真实)代码,而且通常很难让我喜欢其他人的代码(我没有太多时间挖掘ZF,但PEAR例如[他们也有他们的编码标准]只是可怕的国际海事组织),你给的第一个例子似乎很愚蠢,但关于第二个例子,至少对我来说很容易理解,并且从你提供的短片段看来,你似乎有一致的编码风格,并且在右侧使用空格数量和在正确的地方 - 这对清除代码非常重要(如果你不相信我只是看一些Perl代码片段)。

我只想指出三点:

  1. 语义:虽然rSum不是一个属性也不太清楚它持什么样的价值观可怕的名字,也许你会发现该属性的更具描述性的名称?
  2. 可变重用:就像我说你的第一个例子似乎之前愚蠢的,但它实际上是智能重用的变量主要有两个原因:
    1. 你不浪费内存。
    2. 而且你不污染你正在使用的范围。
  3. ,如果你使用了正确的功能你的第二个 “真正” 的例子可能是更清洁和更快速:

    $这个 - > RSUM = array_flip(爆炸(” “$这个 - >选项[” RSUM“]));

编辑:我刚刚注意到我在上面提供的代码是不是你做的相当我们的(0不是由我的大脑处理),这里是另一个工作选择:

$this->rSum = array_fill_keys(explode(",", $this->options["rSum"]), 0); 

这里似乎有很多人不喜欢单线队员,但我相信上面的代码是清晰,高效和描述性的 - 但这可能只是我...... =)

8

智能代码不一定在我看来,好的代码。我个人更喜欢干净,简单和易于理解的代码。你的第二行代码会让你的同事觉得很难,而不是你的初始“坏”代码。

这只是反正

+1

同行,不是梨:P – Viet 2010-05-05 10:06:15

3

我拿除了编码标准,可以使用PHP_CodeSniffer得到您的现有代码一般的提示。

0

吉姆·李表示同意,我也更喜欢微优化或聪明,但丑陋的一行代码可读的代码。

唯一的麻烦,我与你的第一个例子是,它采用面向过程的功能,我会更好地重写OOP(函数的调用这样可以链接并保持易于阅读)。

PHP还没有一个强大的面向对象的目标,因为它使用其API中主要的程序语句。但我更喜欢用OO方式编写我的代码,很好地解耦和组织,而不是有很多有很多参数的函数来让它们一起工作。

-3

一个试图在一个方面做eveything的东西行可以导致代码假设。当我不得不修复它们时,我觉得它真的很烦人。对象链接更常见。例如,

$object->getAnotherObject()->getAThirdObject()->doSomething(); 

很多人会告诉你,它更容易阅读;然而它依靠每次返回都是一个对象。我更愿意返回每一个并检查响应。

$secondObject = $object->getAnotherObject(); 
if (is_object($secondObject)) { 
    $thirdObject = $secondObject->getAThirdObject(); 
    if (is_object($thirdObject)) { 
     $thirdObject->doSomething(); 
    } 
} 

确实需要更多击键,但它不太可能爆炸,而且我认为无论如何,更易于阅读。

虽然值得重复BorisGuéry写的东西。 必须一致。

+0

“清洁?!更容易阅读?!”流畅的接口摇滚,例如SQL生成器类:'$ sql-> select('posts','title') - > where(array('user_id'=> 5)) - > order('date','desc ') - > limit(10);',用你的方法,这将需要5个无用的缩进级别,因为在流畅的接口中,所有方法都应该返回对象,不管它是什么。 – 2010-05-05 12:12:10

+0

当你知道什么是回来,这很好。当你跳进一个项目并且在编码时必须开始理解,那么如何?你不能基于最好的情况。 如果某人更新了正在处理的项目的一部分,并使某个对象返回一组对象,该怎么办? – Khainestar 2010-05-10 16:39:56

+0

德米特法则怎么样? – 2015-01-07 10:16:52