PHP和编写干净的代码

时间:2010-05-05 06:08:51

标签: php coding-style code-formatting

我试图找到编写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();

6 个答案:

答案 0 :(得分:8)

在我看来,智能代码不一定是好代码。我个人更喜欢干净,简单易懂的代码。你的2个班轮将让你的同伴认真思考,而不是你的初始“坏”代码。

这只是我的看法

答案 1 :(得分:7)

  1. Zend Framework Coding Standard
  2. PEAR Coding Standard
  3. 最重要的是,保持一致

答案 2 :(得分:3)

除了编码标准之外,您还可以使用PHP_CodeSniffer获取现有代码的一般提示。

答案 3 :(得分:3)

我真的很喜欢你的(真实的)代码,而且通常我很难想到其他人的代码(我没有太多时间去挖掘ZF但是PEAR例如[他们也有他们的编码标准]很糟糕IMO),你给出的第一个例子看起来很愚蠢但是对于第二个例子,它至少对我来说很容易理解,从你提供的简短片段看来你似乎有一致的编码风格并且使用适当数量的空格在适当的地方 - 这对于干净的代码来说非常重要(如果你不相信我只是看看一些Perl片段)。

我只想指出三件事:

  1. 语义:虽然rSum对于一个属性来说不是一个糟糕的名称,但它不清楚它持有什么值,也许你可以为该属性找到一个更具描述性的名称?
  2. 变量重用:正如我之前所说的,你的第一个例子看起来很愚蠢,但重用变量实际上很聪明,主要有两个原因:
    1. 你不浪费记忆。
    2. 并且您不会污染您正在使用的范围。
  3. 如果您使用正确的功能,您的第二个“真实”示例可能更清晰,更快:

    $ this-> rSum = array_flip(explode(“,”,$ this-> options [“rSum”]));

  4. 编辑:我刚刚注意到我上面提供的代码并不是你正在做的事情(我的大脑没有处理0),这是另一个可行的替代方案:< / p>

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

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

答案 4 :(得分:0)

与Jim Li达成一致,我也更喜欢可读代码而非微优化或智能但丑陋的单行代码。

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

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

答案 5 :(得分:-3)

尝试在一行中执行eveything的一件事可能导致代码假设。当我不得不继续修复它时,我觉得非常讨厌。对象链更常见。例如

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

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

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

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

虽然值得重复BorisGuéry所写的内容。 保持一致。