gpt4 book ai didi

PHP 短路评估(好/坏?)

转载 作者:搜寻专家 更新时间:2023-10-31 20:48:37 25 4
gpt4 key购买 nike

这是一个一般性的问题,但为了解释它,我将使用一个具体的例子。

我有一个加载文档的函数。如果该文档不存在,它将创建它,如果它存在,它将把它转换为一个 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() 或 die(); 的效果做了一些事情,所以我想,为什么不用 json_decode() 或 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();
}

看起来,甚至读起来也很愉快。那么我的下一轮问题。这是好习惯吗?我明白,但其他人会吗?它真的有用吗,或者这是一个大团圆结局的错误?我环顾四周,发现我要问的是所谓的短路评估,而不是错误。很高兴知道。我使用这个新术语来改进我的搜索并找到了更多 Material 。

Blog Entry

Wikipedia

我发现的关于使用短路的内容并不多,而且我发现的大多数内容都以我询问的方式总是指的是 MySQL 连接。现在,我知道大多数人都反对使用 或 die() 术语,但这只是因为它是处理错误的一种不优雅的方式。对于我所询问的方法而言,这不是问题,因为我不打算使用 或 die()。还有其他不使用它的理由吗?维基百科似乎是这么认为的,但只是引用了 C。我知道 PHP 是用 C 编写的,所以这绝对是相关信息。但是这个问题在 PHP 编译中已经被解决了吗?如果不是,是否像维基百科所说的那样糟糕?

这是来自维基百科的片段。

维基百科 - “短路会导致现代处理器的分支预测错误,并显着降低性能(一个显着的例子是光线追踪中高度优化的光线与轴对齐的框相交代码)[需要澄清]。一些编译器可以检测到这种情况并发出更快的代码,但由于可能违反 C 标准,这并不总是可能的。高度优化的代码应该使用其他方式来做到这一点(如手动使用汇编代码)“

大家怎么看?

编辑

我已经对另一个论坛进行了投票,并在那里获得了一些不错的结果。普遍的共识似乎是这种形式的变量赋值虽然有效,但并不受欢迎,甚至可能被认为是现实世界中的不良形式。我会继续关注实地情况,如果有任何新消息出现,我会对此进行更新。感谢 Corbin 和 Matt 的投入,尤其是 Corbin 整理了一些内容。 Here如果您感兴趣,请提供论坛帖子的链接。

最佳答案

您提出了几个不同的问题,所以我会尽力一一解答。

遗漏分支预测:除非您使用 C 或汇编语言编写代码,否则不要担心这一点。在 PHP 中,您与硬件相距甚远,以至于考虑分支预测对您没有帮助。无论哪种方式,这都将是一个非常微观的优化,尤其是在一个开始进行大量字符串解析的函数中。

Is there any other reason not to use this? Wikipedia seems to think so, but only in reference to C. I know PHP is written in C, so that is definitely pertinent information.

PHP 可能会将其解析为不同的执行结构。除非您计划将此功能运行数百万次,或者您知道这是一个瓶颈,否则我不会担心。在 2012 年,我发现使用 短路几乎不可能导致十亿分之一秒的差异。

至于格式,我发现 $a 或 $b 相当难看。我的头脑无法像在 if 子句中看到的那样理解短路。

if (a() || b())

在我看来,只有当 a() 的计算结果不为真时,b() 才会执行。

但是:

return a() or b();

对我来说没有同样的清晰度。

这显然只是一种意见,但我会提供两种替代方案来说明我可能会如何编写它(在我看来,这更清楚一点):

function load($file) {
if (!file_exists($file)) {
touch($file);
return array();
}

$raw = file_get_contents($file);

$contents = json_decode($raw, true);

if (is_array($contents)) {
return $contents;
} else {
return array();
}

}

如果您不关心文件是否真的被创建,您可以更进一步:

function load($file) {

$raw = file_get_contents($file);

if ($raw !== false) {
$contents = json_decode($raw, true);
if ($contents !== null) {
return $contents;
}
}

return array();

}

我想这些代码片段真的归结为个人喜好。第二个片段可能是我会选择的片段。其中的关键路径可能更清晰一些,但我觉得它在不牺牲可理解性的情况下保持简洁。

编辑:如果您是每个函数返回 1 个类型的人,则以下内容可能更可取:

function load($file) {

$contents = array();

$raw = file_get_contents($file);

if ($raw !== false) {
$contents = json_decode($raw, true);
if ($contents === null) {
$contents = array();
}
}

return $contents;

}

关于PHP 短路评估(好/坏?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10506936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com