将函数名称文字传递给更高阶函数是否安全?

时间:2017-11-22 10:57:24

标签: php higher-order-functions

在Javascript中,我习惯于传递函数,因为它们是第一类值。但是,在PHP中我得到通知" 使用未定义的常量添加 - 假设'添加' ":

function fold($f, $acc) {
  return function ($xs) use ($f, &$acc) {
    return array_reduce($xs, $f, $acc);
  };
}

function add($m, $n) {return $m + $n;};

fold(add, 0) ([1, 2, 3]);

我知道我可以分配一个lambda $add = function ($m, $n) {return $m + $n;},但我更喜欢简洁add。从长远来看这是安全还是我注定了?

1 个答案:

答案 0 :(得分:2)

PHP函数并不像那样“一流”。你实际上没有按名称传递函数,你只是传递一个未定义的常量and。在这种情况下的行为是提出通知*,并回退到字符串值“和”;这是全局函数的有效标识符,因此代码运行成功(尽管有错误通知)。

将函数直接传递给fold()的唯一方法是将其分配给变量,如您所说。否则,你只是传递一个全局函数的名称,虽然它可以正常工作,但它可能不是你想要实现的。

*只是一个快速的附录,请注意此通知将在PHP 7.2中变为警告