如何在 PHP 中的 class 中使用匿名函数?
How do you use an anonymous function inside a class in PHP?
如何在 class 中调用 $greet
?我正在使用 PHP 5.5.4.
<?PHP
class Model
{
public $greet = function($name)
{
printf("Hello %s\r\n", $name);
};
}
$test = new Model();
$test->greet('World');
$test->greet('PHP');
?>
Parse error: syntax error, unexpected '$greet' (T_VARIABLE), expecting function (T_FUNCTION)
也试过这个,
$test = new Model();
call_user_func($test->greet('World'));
call_user_func($test->greet('PHP'))
匿名函数在 class 之外工作正常(直接来自 manual)。
<?php
$greet = function($name)
{
printf("Hello %s\r\n", $name);
};
$greet('World');
$greet('PHP');
?>
编辑:我在通话中取出了美元符号(我在回答开始出现时抓住了它。它没有帮助,
call_user_func($test->greet('World'));
call_user_func($test->greet('PHP'));
编辑:
class Model
{
public $greet;
function __construct()
{
$this->greet = function($name)
{
printf("Hello %s\r\n", $name);
};
}
}
$test = new Model();
$test->greet('johnny');
现在我明白了,
Fatal error: Call to undefined method Model::greet()
不能用表达式的结果初始化对象变量。只允许 static/constant 个值。例如
class foo {
public $bar = 1+1; // illegal - cannot use an expression
public $baz = 2; // valid. '2' is a constant
}
你必须做的:
class foo {
public $bar;
function __construct() {
$this->bar = function() { .... }
}
}
并根据 this answer:
实际调用闭包
$x = new foo()
$x->bar->__invoke();
您调用 greet
的事实使得 PHP 将其视为函数而不是 属性。 属性 和 PHP 中的方法可以使用相同的名称,因此区别是相关的。
PHP 7+
在 PHP7 中,不再需要 __call()
方法来调用绑定到属性的闭包,因为 Uniform Variable Syntax。这将允许您在任何代码周围添加括号,就像您在算术中所做的那样。
class Model
{
public $greet;
function __construct()
{
$this->greet = function($name)
{
printf("Hello %s\r\n", $name);
};
}
}
$test = new Model();
($test->greet)('johnny');
PHP 5
作为解决方法,您可以使用 __call()
魔术方法。它将捕获对未定义的 greet
方法的调用。
class Model
{
public $greet;
function __construct()
{
$this->greet = function($name)
{
printf("Hello %s\r\n", $name);
};
}
function __call($method, $args)
{
if (isset($this->$method) && $this->$method instanceof \Closure) {
return call_user_func_array($this->$method, $args);
}
trigger_error("Call to undefined method " . get_called_class() . '::' . $method, E_USER_ERROR);
}
}
$test = new Model();
$test->greet('johnny');
如何在 class 中调用 $greet
?我正在使用 PHP 5.5.4.
<?PHP
class Model
{
public $greet = function($name)
{
printf("Hello %s\r\n", $name);
};
}
$test = new Model();
$test->greet('World');
$test->greet('PHP');
?>
Parse error: syntax error, unexpected '$greet' (T_VARIABLE), expecting function (T_FUNCTION)
也试过这个,
$test = new Model();
call_user_func($test->greet('World'));
call_user_func($test->greet('PHP'))
匿名函数在 class 之外工作正常(直接来自 manual)。
<?php
$greet = function($name)
{
printf("Hello %s\r\n", $name);
};
$greet('World');
$greet('PHP');
?>
编辑:我在通话中取出了美元符号(我在回答开始出现时抓住了它。它没有帮助,
call_user_func($test->greet('World'));
call_user_func($test->greet('PHP'));
编辑:
class Model
{
public $greet;
function __construct()
{
$this->greet = function($name)
{
printf("Hello %s\r\n", $name);
};
}
}
$test = new Model();
$test->greet('johnny');
现在我明白了,
Fatal error: Call to undefined method Model::greet()
不能用表达式的结果初始化对象变量。只允许 static/constant 个值。例如
class foo {
public $bar = 1+1; // illegal - cannot use an expression
public $baz = 2; // valid. '2' is a constant
}
你必须做的:
class foo {
public $bar;
function __construct() {
$this->bar = function() { .... }
}
}
并根据 this answer:
实际调用闭包$x = new foo()
$x->bar->__invoke();
您调用 greet
的事实使得 PHP 将其视为函数而不是 属性。 属性 和 PHP 中的方法可以使用相同的名称,因此区别是相关的。
PHP 7+
在 PHP7 中,不再需要 __call()
方法来调用绑定到属性的闭包,因为 Uniform Variable Syntax。这将允许您在任何代码周围添加括号,就像您在算术中所做的那样。
class Model
{
public $greet;
function __construct()
{
$this->greet = function($name)
{
printf("Hello %s\r\n", $name);
};
}
}
$test = new Model();
($test->greet)('johnny');
PHP 5
作为解决方法,您可以使用 __call()
魔术方法。它将捕获对未定义的 greet
方法的调用。
class Model
{
public $greet;
function __construct()
{
$this->greet = function($name)
{
printf("Hello %s\r\n", $name);
};
}
function __call($method, $args)
{
if (isset($this->$method) && $this->$method instanceof \Closure) {
return call_user_func_array($this->$method, $args);
}
trigger_error("Call to undefined method " . get_called_class() . '::' . $method, E_USER_ERROR);
}
}
$test = new Model();
$test->greet('johnny');