【发布时间】:2012-05-17 10:16:21
【问题描述】:
这是一个一般性的问题,但为了解释它,我将使用一个具体的例子。
我有一个加载文档的函数。如果该文档不存在,它将创建它,如果它确实存在,则将其转换为 JSON 数组。我总是希望这个函数返回某种数组,无论json_decode() 是否存在问题或者文件不存在。目前我正在这样做......
function load($file) {
if( ! file_exists($file)) {
$handle = fopen($file, 'w');
fclose($handle);
}
$raw = file_get_contents($file);
$contents = json_decode($raw, TRUE);
return( ! $contents ? array() : $contents);
//cant use ternary shorthand "?:" in PHP 5.2, otherwise this would be shorter
}
现在,上面的代码没有任何问题(至少我认为没有问题,并且工作正常)。然而,我一直在寻找改进我的代码并在保持其清晰易读的同时对其进行压缩的方法。而那个 return 语句一直困扰着我,因为它看起来效率很低。所以今天我开始思考并且发生了一些事情。我记得看到 mysql 教程对connect() or die(); 的效果有所帮助,所以我想,为什么不json_decode() or array();?这甚至会起作用吗?所以我重写了我的函数来找出...
function load($file) {
if( ! file_exists($file)) {
$handle = fopen($file, 'w');
fclose($handle);
}
$raw = file_get_contents($file);
return json_decode($raw, TRUE) or array();
}
似乎如此,甚至读起来也足够令人愉快。继续我的下一轮问题。这是好习惯吗?我明白,但其他人会吗?它真的有效吗,或者这是一个快乐结局的错误?我环顾四周,发现我要问的是所谓的短路评估,而不是错误。很高兴知道。我使用这个新术语来优化我的搜索并想出了更多的材料。
在我所询问的方式中,我发现的几乎所有关于使用短路的内容都很少提及 MySQL 连接。现在,我知道大多数人反对使用or die() 术语,但这仅仅是因为它是一种处理错误的不雅方式。这对于我所询问的方法来说不是问题,因为我不想使用or die()。还有其他理由不使用它吗? Wikipedia 似乎是这样认为的,但仅参考 C。我知道 PHP 是用 C 编写的,所以这绝对是相关信息。但是这个问题在 PHP 编译中已经被淘汰了吗?如果不是,它是否像维基百科所说的那样糟糕?
这是来自维基百科的 sn-p。
Wikipedia - “短路会导致现代处理器的分支预测错误,并显着降低性能(一个显着的例子是高度优化的光线,光线追踪中的轴对齐框相交代码)[需要澄清]。一些编译器可以检测到这种情况并发出更快的代码,但由于可能违反 C 标准,这并不总是可能的。高度优化的代码应该使用其他方式来执行此操作(如手动使用汇编代码)"
大家觉得呢?
编辑
我在另一个论坛上进行了民意调查,并在那里获得了一些不错的结果。普遍的共识似乎是这种形式的变量赋值虽然有效,但不是首选,在现实世界中甚至可能被认为是不好的形式。我会继续关注地面,如果有任何新情况出现,我会更新。感谢 Corbin 和 Matt 的意见,特别是 Corbin 澄清了一些事情。如果您有兴趣,Here 是论坛帖子的链接。
【问题讨论】:
-
@DaveRandom 来自反对 php 的人的典型回答
-
在您最初的退货声明中,为什么要加入否定的内容?
return $contents ? $contents : array();。也不需要括号。 -
@Madbreaks:这实际上是来自我删除的先前条件。它最初看起来像
return( ! isset($contents) || ! $contents ? array() : $contents);这可能更能说明为什么会这样,我只是在更改它时忽略了重新定位其余部分。
标签: php short-circuiting