$f = function($v) {
return $v + 1;
}
echo $f(4);
// output -> 5
Вышеупомянутое отлично работает. Однако я не могу воспроизвести это правильно, если f является свойством класса.
class MyClass {
public $f;
public function __construct($f) {
$this->f = $f;
}
public function methodA($a) {
echo $this->f($a);
}
}
// When I try to call the property `f`, PHP gets confused
// and thinks I am trying to call a method of the class ...
$myObject = new myClass($f);
$myObject->methodA(4);
Вышеуказанное приведет к ошибке:
Call to undefined method MyClass::f()
myClass($f); -> где определяется $f?
@AlivetoDie f - это не метод, это функция, хранящаяся в переменной, переданной конструктору как свойство класса.






Я думаю, проблема в том, что он пытается понять
echo $this->f($a);
И, как вы обнаружили, он хочет вызвать функцию-член f в классе. Если вы измените его на
echo ($this->f)($a);
Он интерпретирует это так, как вы хотите.
PHP 5.6 Спасибо ADyson за комментарий, думаю, это работает
$f = $this->f;
echo $f($a);
возможно, стоит отметить, что это работает только в PHP7
Я думал, что это сработает, но это приводит к синтаксической ошибке unexpected '('.
@AlivetoDie предполагается, что ввод - это функция ... например. eval.in/997678
@ TT4M.C см. Мой комментарий - вы используете PHP 5? eval.in/997680 показывает, что он не работает в PHP 5, но eval.in/997678 показывает, что он работает в PHP 7
@ADyson Да, я использую PHP 5.6
@ TT4M.C в этом случае вы, к сожалению, не можете использовать этот синтаксис.
$f = $this->f; echo $f($a); в PHP5 вы можете сначала назначить свойство переменной ... затем оно работает
@NigelRen, извините, только что видел ваше обновление, тем временем я опубликовал ответ в том же духе. Хотя, похоже, номинированный обман уже охватывает оба случая.
Хотя ответ Найджела Рена (https://stackoverflow.com/a/50117174/5947043) будет работать в PHP 7, этот слегка расширенный синтаксис будет работать и в PHP 5:
class MyClass {
public $f;
public function __construct($f) {
$this->f = $f;
}
public function methodA($a) {
$func = $this->f;
echo $func($a);
}
}
$f = function($v) {
return $v + 1;
};
$myObject = new myClass($f);
$myObject->methodA(4);
См. https://eval.in/997686 для рабочей демонстрации.
на что равняется первый
$f?