PHP和编写干净的代码

PHP和编写干净的代码,php,coding-style,code-formatting,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_

我试图找到编写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));
如果有人能给我一些编写干净代码的好教程,那就太好了

又是我问了愚蠢的问题


顺便说一下

模型中可以有多少自动处理

我有一个模型,它有一个execute方法,当我调用它时,它会做很多事情,比如读取定义文件和进行数据库查询

比如说

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

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

  • 最重要的是,保持一致

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


    这只是我的想法。

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

    同意Jim Li的观点,我也更喜欢可读代码而不是微优化或智能但丑陋的单行代码

    我在第一个示例中遇到的唯一问题是,它使用面向过程的函数,我最好重写OOP(像这样的函数调用可以链接起来,并且易于阅读)

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

    我真的很喜欢你的(真实的)代码,而且我通常很难喜欢其他人的代码(我没有太多时间钻研ZF,但PEAR(例如,他们也有自己的编码标准)在我看来太糟糕了),你给出的第一个示例看起来很愚蠢,但是关于第二个,至少对我来说,这是很容易理解的,从您提供的简短代码片段来看,您似乎有一个一致的编码风格,并且在正确的位置使用了正确数量的空格——这对于干净的代码非常重要(如果您不相信我,请看一些Perl代码片段)

    我只想指出三点:

  • 语义:虽然
    rSum
    对于属性来说不是一个糟糕的名称,但它所包含的值并不十分清楚,也许您可以为该属性找到一个更具描述性的名称
  • 变量重用:正如我前面所说,您的第一个示例看起来很愚蠢,但实际上重用变量是明智的,原因有两个:
  • 你不会浪费记忆
  • 而且你不会污染你的工作范围
  • 如果使用正确的功能,您的第二个“真实”示例可能会更简洁、更快:

    $this->rSum=array_flip(分解(“,”,$this->options[“rSum”)

  • 编辑:我刚刚注意到我上面提供的代码与您所做的不完全一样(我的大脑没有处理
    0
    ),下面是另一个工作选项:

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

    这里似乎有很多人不喜欢一行程序,但我相信上面的代码是清晰、高效和描述性的,但这可能只是我…=)

    在一行中尝试做所有事情都会导致代码假设。当我不得不继续修理它们时,我觉得这很烦人。这在对象链接中更常见。比如说

    $object = new Object()
    $object->setFile("example.txt");
    $object->execute();
    
    // Then i can fetch things from it
    echo $object->getName();
    
    $object->getAnotherObject()->getAThirdObject()->doSomething();
    
    很多人会告诉你,它更容易阅读;然而,它依赖于每次返回都是一个对象。我宁愿返回每一个并检查响应

    $secondObject = $object->getAnotherObject();
    if ( is_object($secondObject) ) {
        $thirdObject = $secondObject->getAThirdObject();
        if ( is_object($thirdObject) ) {
            $thirdObject->doSomething();
        }
    } 
    
    当然,它需要更多的按键,但爆炸的可能性更小,而且,我认为无论如何,它更容易阅读


    尽管值得重复鲍里斯·盖里的话保持一致。

    “更干净?!更容易阅读?!”例如,SQL Builder类:
    $SQL->select('posts','title')->其中(数组('user_id'=>5))->顺序('date','desc')->限制(10),使用您的方法,这将需要5个无用的缩进级别,因为在fluent接口中,所有方法都应该返回对象,无论发生什么。当您知道返回的是什么时,这是很好的。当你跳入一个项目,并且在编写代码时必须开始理解时,情况如何?你不能把事情建立在最佳情况的基础上。如果有人更新了您正在处理的项目的一部分,并使某个项目返回一个对象数组,该怎么办?demeter法则呢?如果
    $secondObject
    不是对象,该怎么办?单元测试应该管理这个,而不是应用程序代码。