gpt4 book ai didi

PHP 反射类 hasMethod 和 __call()

转载 作者:搜寻专家 更新时间:2023-10-31 20:53:03 25 4
gpt4 key购买 nike

我正在创建一个响应魔法 __call() 方法的动态类。问题是,因为我是在一个已经存在的框架 (Kohana) 之上构建它,它使用 ReflectionClass::hasMethod 检查类的方法是否存在,但它似乎不存在触发 __call() 魔术方法来检查它是否存在。在这种情况下我能做什么?似乎如果您动态添加方法(如 $this->{$name} = function(){})它仍然无法“看到”它

最佳答案

没有更多细节,我不确定这是否足够,但是您可以创建代理类来执行中间功能:

   class MyProxy {

protected $_object = null;
protected $_methods = array();

public function __construct($object) {
if (!is_object($object)) {
throw new InvalidArgumentException('$object must be an object');
}
$this->_object = $object;
}

public function __call($name, $arguments) {
return $this->callMethod($name, $arguments);
}

public function setMethod($name, Closure $method) {
$this->_methods[(string) $key] = $method;
}

public function callMethod($name, array $arguments) {
if (isset($this->_methods[$name])) {
return call_user_func_array($this->_methods[$name], $arguments);
}
return call_user_func_array(array($this->_object, $name), $arguments);
}

}

通过调用 $proxy->setMethod('foo', function () { });,您可以动态地将方法“附加”到对象。当您调用 $proxy->foo() 时,它会首先查找动态附加的方法;如果它找到一个,它会调用它。否则,它只会委托(delegate)给内部对象。

现在,这种方法的问题是附加方法没有绑定(bind)到代理。换句话说,$this 不存在于附加方法的范围内。

虽然这可以通过 PHP 5.4+ 的功能修复。

public function setMethod($name, Closure $method) {
$this->_methods[(string) $name] = Closure::bind($method, $this);
}

我们将 setMethod 细化为 rebind the passed closure到代理。现在,在附加方法的范围内,$this 将指向代理对象。

我们本可以将它重新绑定(bind)到封闭对象,但是附加方法无法与代理(或其他附加方法)对话。为了完整起见,您需要添加 __get__set 魔法,以将属性访问/变异调用转发给内部对象(或在代理中处理它们,随便)

此外,内部对象对代理一无所知,因此它的方法(来自类定义)无论如何也不会知道任何这种动态魔法。

关于PHP 反射类 hasMethod 和 __call(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5607217/

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