Безопасно ли передавать литералы имен функций в функции более высокого порядка?

В Javascript я привык передавать функции, так как они являются значениями первого класса. Тем не менее, в PHP я получаю уведомлениеИспользование неопределенной константы add — предполагается «add»«:

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]);

Я знаю, что могу просто назначить лямбду $add = function ($m, $n) {return $m + $n;}Я предпочитаю более сжатый add хоть. Это безопасно или я обречен в долгосрочной перспективе?

2

Решение

Функции PHP не такие «первоклассные», как это. Вы на самом деле не передаете функцию по имени, вы просто передаете неопределенную константу, and, Поведение в этой ситуации состоит в том, чтобы поднять уведомление * и вернуться к строковому значению «и»; это допустимый идентификатор вашей глобальной функции, и поэтому код выполняется успешно (хотя и с уведомлением об ошибке).

Единственный способ передать функцию непосредственно в fold() это присвоить его переменной, как вы говорите. В противном случае вы просто передаете имя глобальной функции, и хотя это будет работать нормально, вероятно, это не совсем то, чего вы хотите достичь.

* Просто быстрое дополнение, чтобы заметить, что это уведомление изменится на предупреждение в PHP 7.2

3

Другие решения

Других решений пока нет …