这是一个普遍的排序问题,但解释它我会用一个具体的例子。PHP短路评估(好/坏?)
我有一个加载文档的函数。如果该文档不存在,它将创建它,如果它存在,它会将其转换为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
}
现在,有没有错,上面的代码(至少我不觉得有什么,它工作正常)。不过,我一直在寻找方法来改善我的代码并在保持完美清晰的同时对其进行压缩。这个回归声明一直困扰着我,因为它看起来效率很低。所以今天我开始思考和发生了一些事情。我记得看到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()
。有没有其他的理由不使用它?维基百科似乎认为是这样,但只是参考C.我知道PHP是用C编写的,所以这是绝对有用的信息。但是这个问题在PHP编译中已经出现了吗?如果不是这样,它和维基百科一样糟糕吗?
这是维基百科的片段。 “短路会导致现代处理器的分支预测出现错误,并且会大大降低性能(一个值得注意的例子是高度优化的射线跟踪中与轴对齐的盒子相交代码的光线)[需要澄清]。一些编译器可以检测到这种情况并发出更快的代码,但由于可能违反C标准,并不总是可能的。高度优化的代码应该使用其他方式来执行此操作(如手动使用汇编代码)“
什么你们都在想吗?
编辑
我调查的另一个论坛,并得到了一些好成绩出现。普遍的共识似乎是,这种形式的变量赋值虽然有效,但并不是首选,甚至可能被认为是现实世界中的不良形式。我会继续留心,如果有新事物出现,我会更新它。感谢Corbin和Matt提供的信息,尤其是Corbin为了解决一些问题。 Here的链接到论坛帖子,如果你有兴趣。
@DaveRandom反对php的人的典型答案 – Matt
在您的原始返回声明中,为什么要烘焙消极? '返回$内容? $ contents:array();'。也不需要父母。 – Madbreaks
@Madbreaks:这实际上是从我之前删除的一个条件。它最初看起来像'return(!isset($ contents)||!$ contents?array():$ contents);'这可能会让我更加明白为什么它是这样的,我只是忽略了在我休息时重新定位改变了它。 – mseancole