例如,我有以下内容:
class A{
__invoke(){
// return an instance of class A itself
}
}
我可以这样做吗?
new A()()()()... or (new A())()()()...
这里有什么解释? 假设PHP版本比5.4更新
好的,我可以再解释一下为什么我要问: 我正在使用ganon.php这是一个开源的html dom解析器。 它使用类似$ html_node(' child_tag')的语法来返回另一个子$ html_node,其中$ html_node是类HTML_NODE的对象实例。所以我在想是否可以使用链接在嵌套的html dom结构中进行选择。
答案 0 :(得分:4)
对于PHP版本BsonClassMap.RegisterClassMap<GroceryList>(cm =>
{
cm.AutoMap();
cm.UnmapMember(m => m.IsOwner);
});
,您可以像
7.0.0 - 7.0.4
<强>输出:强>
class A{
public function __invoke($x){
return __FUNCTION__."$x";
}
}
echo (new A())(2);
答案 1 :(得分:4)
我认为您描述的行为实际上并不起作用,即使在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
(demo)
您可能对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!
(demo)
只要函数返回带有效函数名称的更多字符串,就可以链接它,但__invoke
和类都不起任何相关作用:
function one() {
return 'two';
}
function two() {
return 'three';
}
function three() {
return 'four';
}
function four() {
echo 'Done!';
}
$a = one()()()();
Done!
(demo)
注意:上面的所有代码片段都需要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)
当然,这是PHP / 7语法。对于旧版本,您需要具有突破魔力的辅助变量:
$a = new A();
$b = $a(1);
$c = $b(2);
$d = $c(3);
$d(4);