例如,我有以下几点:
class A{
__invoke(){
// return an instance of class A itself
}
}我能做以下几件事吗?
new A()()()()... or (new A())()()()...这里的解释是什么?假设PHP版本比5.4更新
好的,我可能会给出更多的解释,为什么我会问:我使用的是ganon.php,这是一个开源的html解析器。它使用像$html_node('child_tag')这样的语法返回另一个子$html_node,其中$html_node是类HTML_NODE的对象实例。因此,我在想,是否可以使用链接在嵌套的html多姆结构中进行选择。
发布于 2016-03-23 10:34:33
我不认为您所描述的行为实际有效,甚至在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);(演示)
当然,这是PHP/7语法。对于旧版本,您需要辅助变量来打破魔术:
$a = new A();
$b = $a(1);
$c = $b(2);
$d = $c(3);
$d(4);发布于 2016-03-23 09:59:23
对于PHP版本的7.0.0 - 7.0.4,您可以如下所示
class A{
public function __invoke($x){
return __FUNCTION__."$x";
}
}
echo (new A())(2);输出:
__invoke2https://stackoverflow.com/questions/36174623
复制相似问题