我不认为您描述的行为实际上有效,即使在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
您可能对variable functions功能感到困惑.如果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);
当然,这是PHP / 7语法.对于旧版本,您需要具有突破魔力的辅助变量:
$a = new A();
$b = $a(1);
$c = $b(2);
$d = $c(3);
$d(4);