Php 以嵌套方式调用函数还是在var中拆分每个通道更好?

Php 以嵌套方式调用函数还是在var中拆分每个通道更好?,php,Php,就拿这三个例子来说: 一个 return lowercaseKeys(json_decode(trim($json),true)); $return = trim($json); $return = json_decode($return,true); $return = lowercaseKeys($return); return $return; 两个 $trimmed = trim($json); $array = json_decode($trimmed,true); $return

就拿这三个例子来说:

一个

return lowercaseKeys(json_decode(trim($json),true));
$return = trim($json);
$return = json_decode($return,true);
$return = lowercaseKeys($return);
return $return;
两个

$trimmed = trim($json);
$array = json_decode($trimmed,true);
$return = lowercaseKeys($array);
return $return;
三个

return lowercaseKeys(json_decode(trim($json),true));
$return = trim($json);
$return = json_decode($return,true);
$return = lowercaseKeys($return);
return $return;
除了可读性之外,哪种性能最好? 什么是最佳实践


p、 美国代码只是一个例子,与问题无关,我只是从记事本窗口复制粘贴的内容。

性能方面,我认为您不会注意到任何差异。将是微不足道的


但是我投票支持
选项2
,因为它是最容易阅读的(相对于
选项1
),我不认为像在
选项3
(不是很好的形式)中那样继续覆盖它是一个好主意。

在您的示例中,在性能方面应该没有区别。

如果PHP做得对,这些都应该是相同的一次。假设这是真的,选项二是最容易阅读和修改的未来。也许值得一读。

我个人喜欢选项一,至于你的问题:

哪种性能最好?选择一

什么是最佳实践?选项一和选项二取决于功能的复杂性

但让我们看看它们作为一个函数是如何表现的

备选方案一:

// Simple, readable
function optionOne($json) {
    return lowercaseKeys(json_decode(trim($json),true));
}
备选方案二:

// Still readable with a little more detail to a novice developer
function optionTwo($json) {
    $trimmed = trim($json);
    $array   = json_decode($trimmed,true);
    $return  = lowercaseKeys($array);
    return $return;
}
备选方案三:

// This might cause some problems with the $return variable
// Still looks like it would work but I'm not fond of this option
function optionThree($json) {
    $return = trim($json);
    $return = json_decode($return,true);
    $return = lowercaseKeys($return);
    return $return;
}

选项1可能比其他2个选项快一微秒,并且使用的物理内存少一些位,但任何差异都将完全可以忽略,除非按指数级乘以。这里的核心是最终的可读性。我发现选项1非常适合我个人,但我承认在我工作的一些团队中,该选项不符合开发人员最低公分母的标准。选项2和选项3实际上是完全相同的,因为您没有对所创建的额外变量进行任何操作。它们都创建了3个独立的令牌。选项2更具可读性,因为变量描述了该阶段应用的方法,所以我也会投票支持选项2。

我自己倾向于采用“选项2”的方式。你永远不知道什么时候你可能需要从一半到一半的东西。也有助于提高可读性。好吧,虽然效率不高,但为了以后能够理解和编辑代码(特别是如果其他人必须这么做的话),我觉得选项2最好。

我喜欢第一个选项,而且它使用更少的内存,但差异不显著

第一条规则是,在处理微优化时,尽可能做到可读性最好。但这是我做的一个小测试

<?php
$iterations = 1000000;
$tests = array('one', 'two', 'three');
$json = json_encode($tests);

foreach ($tests as $function) {
        echo $function;
        $start = microtime(true);
        for ($i = 1; $i <= $iterations; $i++) {
                $function($json);
        }
        $end = microtime(true);
        echo ' - ' . ($end - $start) . " sec\n";
}

function one($json) {
        return array_change_key_case(json_decode(trim($json),true), CASE_LOWER);
}
function two($json) {
        $trimmed = trim($json);
        $array = json_decode($trimmed,true);
        $return = array_change_key_case($array, CASE_LOWER);
        return $return;
}
function three($json) {
        $return = trim($json);
        $return = json_decode($return,true);
        $return = array_change_key_case($return, CASE_LOWER);
        return $return;
}
?>

选项一确实稍微快一点,但那是一百万次迭代,时间差仍然不明显。在迭代次数较少的情况下,时间变化太大,甚至没有一个模式可以声明一个比另一个更好。

实际上,选项1的速度会稍微快一点,使用的内存也会稍微少一点,特别是在多次调用或在大循环中执行时;但这是性能和可读性之间的折衷。您能指出从哪里获得这些信息吗?我很想知道为什么会有任何不同;如果不在其他上下文中使用占位符变量,PHP不会优化占位符变量吗?如果他立即返回占位符变量,则不会影响内存。速度方面,我认为可以协商。至于性能,你可以测试自己。将每一个都放在一个循环中,并在数千次迭代中对运行(使用函数)计时。就个人而言,如果我只打算使用一次,那么我不喜欢为它创建变量。但是如果有必要,2或3会使以后的调试/错误检查变得更容易。@jswolf19,这不是一个特别好的测试,因为除非输入发生变化,否则结果可能会被严重优化(即使是线性执行,结果也会被严重优化)@gamen,坦白地说,如果考虑到
trim
json\u decode
小写键
中正在进行的字符串解析,这三者之间存在很大差异,我会感到惊讶。如果额外的变量可以显著地影响时间,那么我认为php不会像现在这样被广泛使用。如果结果得到了优化,那么担心哪种性能更好是没有意义的,不管怎样,不是吗?我的观点是,以一种孤立的方式调用相同的代码n次不会产生一个代表性的计时结果。一旦该代码与其他代码一起运行,时间可能会发生很大的变化。我尊重你的意见,但我不能同意。将所有可能的东西粘在一个衬里上,只是为了让它看起来更紧凑,这不一定是好的做法。对你来说,它可能看起来是可读的,但这可能是因为你已经习惯了,而且经常这样做。但是如果你在一个大的团队中工作,那里经常有很多新人加入,我认为这不是一个很好的编码标准——事实上对一些人来说可能是令人畏惧的。我知道这是一个非常基本的方法,但只是笼统地说。@xil3可以理解,正如我所说的,选项二对新手开发人员来说是很好的,我不赞成“将所有可能的东西都放在一行中”,但函数示例使用了一些基本的php函数,如trim()和json_decode()使用它们格式化传递/返回到函数调用本身的对象/var没有问题。现在lowercaseKeys()可以使用选项二,但这一切都取决于函数本身的复杂性