У PHP методи та властивості знаходяться в окремому просторі імен (ви можете мати метод і властивість з однаковим іменем), і чи ви отримуєте доступ до властивості чи методу, залежить від синтаксису, який ви використовуєте для цього.
$expr->something()
є викликом методу, тому PHP буде шукати something
в списку методів класу.
$expr->something
є something
вибором властивості , тому PHP буде шукати у списку властивостей класу.
$myInstance->lambda();
аналізується як виклик методу, тому PHP шукає метод, названий lambda
у вашому класі, але такого методу немає (звідси помилка виклику невизначеного методу ).
Отже, ви повинні використовувати синтаксис властивості fetch для отримання лямбда-сигналу, а потім викликати його.
Оскільки PHP 7.0, ви можете зробити це за допомогою ($obj->lambda)()
:
($obj->lambda)();
У дужках переконайтеся, що PHP аналізує ($obj->lambda)
при виборі властивості з іменем лямбда . Потім ()
викликає результат отримання властивості.
або ви можете зробити це за допомогою ->lambda->__invoke()
:
$myInstance = new MyClass();
$myInstance->lambda->__invoke();
__invoke
є одним із магічних методів PHP . Коли об’єкт реалізує цей метод, він стає викликаним: його можна викликати за допомогою $var()
синтаксису. Анонімні функції - це екземпляри Closure
, які реалізуються __invoke
.
Або призначте його локальній змінній:
$lambda = $myInstance->lambda;
$lambda();
Або зателефонуйте за допомогою call_user_func:
call_user_func($myInstance->lambda);
call_user_func
може викликати будь-які callable
, включаючи анонімні функції.
Як варіант, якщо це загальний шаблон у вашому коді, ви можете налаштувати __call
метод переадресації викликів на свою лямбда-програму:
class MyClass
{
private $lambda;
public function __construct()
{
$this->lambda = function() {
echo "Hello world!\n";
};
}
public function __call($name, $args)
{
return call_user_func_array($this->$name, $args);
}
}
Зараз це працює:
$myInstance = new MyClass();
$myInstance->lambda();
Починаючи з PHP 5.4, ви навіть можете зробити це за ознакою:
trait LambdasAsMethods
{
public function __call($name, $args)
{
return call_user_func_array($this->$name, $args);
}
}
class MyClass
{
use LambdasAsMethods;
private $lambda;
public function __construct()
{
$this->lambda = function() {
echo "Hello World!\n";
};
}
}
$myInstance = new MyClass();
$myInstance->lambda();
__invoke/()
протиcall_user_func
заміток.