gpt4 book ai didi

php - 如何确保我们在属性上使用 __invoke 而不是在主对象上使用 __call?

转载 作者:可可西里 更新时间:2023-11-01 12:52:24 25 4
gpt4 key购买 nike

假设我们有如下代码:

<?php
class Worker {
public function __invoke() {
echo "invoked\n";
}
}

class Caller {
public $worker;

public function __construct($worker) {
$this->worker = $worker;
}

public function __call($name, $arguments) {
echo "called\n";
}
}

$c = new Caller(new Worker());
echo $c->worker();
?>

结果被调用。怎样做才能被调用

最佳答案

这个问题同样存在于匿名函数中。您有几种解决方法:

1) 修改你的 __call 以检查它是否是一个方法,如果不是,调用属性:

if (property_exists($this, $name) && is_object($this->$name) && method_exists($this->$name, "__invoke")) {
call_user_func_array($this->name, $args);
}

2) 直接调用__invoke:$c->worker->__invoke();

3) 将属性保存到一个临时变量中:

$tempVar = $c->worker;
$tempVar();

4)(与 3 几乎相同)(来源:http://marc.info/?l=php-internals&m=136336319809565&w=4)

${'_'.!$_=$c->worker}();

5) 使用call_user_funccall_user_func_array:

call_user_func($c->worker);

关于php - 如何确保我们在属性上使用 __invoke 而不是在主对象上使用 __call?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16794133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com