class MyClass {
var $lambda;
function __construct() {
$this->lambda = function() {echo 'hello world';};
// no errors here, so I assume that this is legal
}
}
$myInstance = new MyClass();
$myInstance->lambda();
//Fatal error: Call to undefined method MyClass::lambda()
那么访问类变量的正确语法是什么?
在 PHP 中,方法和属性位于单独的命名空间中(您可以拥有同名的方法和属性),并且是否访问属性或方法取决于您所使用的语法。
$expr->something()
是一个方法调用,所以PHP会搜索something
在类的方法列表中。
$expr->something
是一个属性获取,所以 PHP 将搜索something
在类的属性列表中。
$myInstance->lambda();
被解析为方法调用,因此 PHP 搜索名为的方法lambda
在你的班级中,但没有这样的方法(因此调用未定义的方法 error).
所以你必须使用获取属性语法来获取 lambda,然后调用它。
-
从 PHP 7.0 开始,您可以使用($obj->lambda)()
:
($obj->lambda)();
括号确保 PHP 能够解析($obj->lambda)
as 获取名为 lambda 的属性. Then, ()
调用获取属性的结果。
-
或者你可以这样做->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
将调用转发给 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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)