【问题标题】:PHP and writing clean codePHP 和编写干净的代码
【发布时间】:2011-02-15 18:58:29
【问题描述】:

我正在尝试寻找编写 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();

【问题讨论】:

    标签: php coding-style code-formatting


    【解决方案1】:

    在我看来,智能代码不一定是好的代码。我个人更喜欢干净、简单且易于理解的代码。你的 2 班轮会让你的同伴努力思考,而不是你的 init “坏”代码。

    这只是我的看法

    【讨论】:

      【解决方案2】:
      1. Zend Framework Coding Standard
      2. PEAR Coding Standard

      最重要的是,保持一致

      【讨论】:

        【解决方案3】:

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

        我只想指出三点:

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

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

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

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

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

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

            【讨论】:

              【解决方案6】:

              试图在一行中做任何事情可能会导致代码假设。当我必须继续修复它们时,我认为这真的很烦人。这在对象链接中更为常见。例如

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

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

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

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

              尽管值得重复 Boris Guéry 所写的内容。 保持一致。

              【讨论】:

              • “更干净?!更容易阅读?!”流畅的接口很重要,例如 SQL Builder 类:$sql->select('posts', 'title')->where(array('user_id' => 5))->order('date', 'desc')->limit(10);,使用您的方法这将需要 5 个无用的缩进级别,因为在流畅的接口中,所有方法无论如何都应该返回对象。
              • 当您知道返回的内容时,这很好。当你进入一个项目并且必须开始理解你的代码时怎么样?你不能把事情建立在最好的情况下。如果有人更新了您正在处理的项目的一部分并让某些东西返回一个对象数组怎么办?
              • 得墨忒耳定律呢?
              • 如果$secondObject 不是一个对象怎么办?单元测试应该管理这个,而不是应用程序代码。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-10-28
              • 2013-04-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多