我认为你所描述的行为在PHP/7中实际上并不起作用:
class A{
public function __invoke($arg){
echo __METHOD__ . "($arg) called" . PHP_EOL;
}
}
$a = new A();
$a(0);
$a(1)(2)(3);
A::__invoke(0) called
A::__invoke(1) called
Fatal error: Function name must be a string
(演示)
您可能对 可变函数 功能感到困惑。如果 foo()
返回一个字符串 'bar',那么 foo()()
等同于 bar()
:
class A{
public function __invoke(){
return 'hello';
}
}
function hello($name) {
echo "Hello, $name!" . PHP_EOL;
}
$a = new A();
$a()('Jim');
Hello, Jim!
(演示)
只要您的函数返回更多有效函数名称的字符串,就可以将其链接在一起,但是__invoke
和类都没有发挥任何重要作用:
function one() {
return 'two';
}
function two() {
return 'three';
}
function three() {
return 'four';
}
function four() {
echo 'Done!';
}
$a = one()()()();
Done!
(演示)
注意:上面所有的代码片段都需要 PHP/7,但是只要使用适当的圆括号和中间变量,就可以使用早期版本来模拟它们。
根据 UlrichEckhardt 的评论更新: 我忽略了“返回类A实例本身”的评论。如果您确实这样做,则代码将有效:
class A{
public function __invoke($arg){
echo __METHOD__ . "($arg) called" . PHP_EOL;
return $this;
}
}
$a = new A();
$a(0);
$a(1)(2)(3);
class A{
public function __invoke($arg){
echo __METHOD__ . "($arg) called" . PHP_EOL;
return $this;
}
}
$a = new A();
$a(0);
$a(1)(2)(3);
(demo)
Of course, this is PHP/7 syntax. For older versions, you need auxiliary variables that break the magic:
$a = new A();
$b = $a(1);
$c = $b(2);
$d = $c(3);
$d(4);
__invoke()
无关。 - Álvaro González