PHP与编写清晰代码

5

我正在尝试寻找编写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个回答

8

在我看来,聪明的代码并不一定是好代码。我个人更喜欢干净、简单和易于理解的代码。你的两行代码会让你的同行深思,而不是你初始的“糟糕”代码。

这只是我的看法。


7

3
我真的很喜欢你的(真正的)代码,通常我很难喜欢其他人的代码(我没有太多时间去深入研究ZF,但例如PEAR [它们也有自己的编码标准] 在我看来就是可怕的),你给出的第一个例子似乎很蠢,但是关于第二个例子,至少对我来说非常容易理解,并且从你提供的短代码片段中可以看出你具有一致的编码风格并且在正确的位置和正确数量使用空格 - 这对于清洁的代码来说至关重要(如果你不相信请看一些Perl代码片段)。
我只想指出三件事:
1. 语义学:虽然 rSum 不是一个可怕的属性名称,但它并不太清楚它持有哪些值,也许你可以为该属性找到一个更具描述性的名称?
2. 变量重用:正如我之前所说,你的第一个例子似乎很愚蠢,但实际上重用变量是聪明的,有两个主要原因:
- 您不会浪费内存。 - 您不会污染您正在使用的范围。
3. 如果您使用正确的函数,您的第二个“真实”示例可能会更干净、更快: $this->rSum = array_flip(explode(",", $this->options["rSum"]));
编辑:我刚刚注意到我提供的代码不完全是你正在做的(0没有被我的大脑处理),这里是另一个可行的替代方案:
$this->rSum = array_fill_keys(explode(",", $this->options["rSum"]), 0);

这里似乎有很多人不喜欢一行代码,但我认为上面的代码清晰、高效、描述准确——当然这只是我的个人看法... =)


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

0

同意Jim Li的看法,我更喜欢可读性强的代码而非微观优化或智能但难看的一行代码。

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

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


-3

试图在一行中完成所有操作可能会导致的一个问题是代码假设。当我不得不不断修复它们时,我认为这真的很烦人。这在对象链接中更为常见。例如:

$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个无用的缩进级别,因为在流畅接口中,所有方法都应该返回对象,不管什么情况。 - Alix Axel
当你知道即将返回的内容时,那很好。但是当你跳入一个项目并开始编码时,如何理解呢?你不能基于最佳情况下的假设。如果有人更新了你正在工作的项目的某个部分,并使其返回对象数组,该怎么办? - Khainestar
关于迪米特法则怎么样? - Julien__
如果$secondObject不是一个对象怎么办?单元测试应该处理这个问题,而不是应用程序代码。 - Styx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接