在PHP中,方法和属性位于单独的命名空间中(您可以有一个具有相同名称的方法和属性),以及是否访问属性或方法取决于您使用的语法。
$ expr-> something()是一个方法调用,因此PHP将在类中搜索一个方法。
$ expr-> something是一个属性提取,所以PHP将在类中搜索一个属性。
$ myInstance-> lambda();被解析为方法调用,因此PHP在您的类中搜索一个名为lambda的方法,但没有这样的方法(因此调用未定义的方法错误)。
所以你必须使用fetch属性语法来获取lambda,然后调用它。
>你可以使用 – > lambda-> __ invoke():
$myInstance = new MyClass();
$myInstance->lambda->__invoke();
__invoke是PHP’s magic methods.当一个对象实现这个方法,它变成可调用:它可以使用$ var()语法调用。匿名函数是Closure的实例,它实现__invoke。
>或者将它分配给一个局部变量:
$lambda = $myInstance->lambda;
$lambda();
>或者使用call_user_func调用它:
call_user_func($myInstance->lambda);
call_user_func可以调用任何callable,包括匿名函数。
>或者,如果这是您的代码中的常见模式,您可以设置一个__call方法来将调用转发到您的lambda:
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:
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();