问两次表现不好?

Onk*_*aps 28 php

我有一个功能:

function getMilk() {
    if($condition == true)
        return "Milk for you, madam";
    return false;
}
Run Code Online (Sandbox Code Playgroud)

例1:

if(getMilk()) 
    echo getMilk();
Run Code Online (Sandbox Code Playgroud)

第一个例子是否使PHP运行两次牛奶?

例2:

echo getMilk(); // don't check for milk first, just get it if they have it
Run Code Online (Sandbox Code Playgroud)

如果我是PHP,我宁愿得到第二个例子.然后,我不必跑到商店检查牛奶,然后再跑一次才能得到它.

示例2会更快/更好,还是不重要?

apo*_*fos 66

是的,您正在调用该函数两次.通过执行以下操作之一,避免这样做(因为调用函数可能很昂贵):

$getMilk = getMilk();
if($getMilk) echo $getMilk;
Run Code Online (Sandbox Code Playgroud)

您可以将其减少为一行(但不可读)格式:

if ($getMilk = getMilk()) echo $getMilk;
Run Code Online (Sandbox Code Playgroud)

您还可以使用内联if三元组,其中包括:

echo getMilk()?:""; //Will echo the result of getMilk() if there is any or nothing.
Run Code Online (Sandbox Code Playgroud)

  • 条件赋值示例是*远**来自*不可读*.这在PHP和Ruby等语言中非常常见,特别是对于这样一个简单的赋值. (25认同)
  • 不应该是`$ milk`而不是`$ getMilk`,或者PHP只是有奇怪的命名约定? (19认同)
  • 我同意这不是_unreadable_.但是,我记得曾经真的很困惑,在我明白它是`=`而不是`==`之前.但这并不会让它变得难以理解. (8认同)
  • @Bergi是的,将它命名为"$ milk"会更有意义但据我所知,没有PHP标准来强制执行那么严格的规则所以我只是选择了一些东西而没有真正考虑约定. (3认同)
  • @apokryfos当然很好.在这种情况下,您显然应该在多行上声明/评估条件.但这不是问题或答案中给出的例子,因此这不是我评估为*不可读的*.最后,这取决于谁进行编码/审查的判断. (2认同)

dec*_*eze 15

是的,PHP会像你告诉的那样经常调用函数.该功能将执行两次.你不应该这样做,因为你本质上不知道任何特定功能的价格是多少,和/或如果你重写函数的实现细节,将来可能会改变.特别是具有副作用的函数(它们修改某些东西,例如它们写入文件)不能经常被调用.

而是将函数结果存储在变量中:

$milk = getMilk();
if ($milk) {
    echo $milk;
}
Run Code Online (Sandbox Code Playgroud)

这甚至可以内联到:

if ($milk = getMilk()) {
    echo $milk;
}
Run Code Online (Sandbox Code Playgroud)

  • 我没有说"经常提到"! (5认同)

Utk*_*nos 5

问题在于理论上比什么都重要,因为性能差异可以忽略不计.

也就是说,在你的情况下,第二种方法很好,因为false不会转化为任何类型的输出.所以

echo getMilk();
Run Code Online (Sandbox Code Playgroud)

要么回声,要么没有.

  • 实际上,当你做`echo false;`,无论是"假"还是0或其他什么时,我有点希望在输出中看到一些东西. (2认同)