我正在创建一个响应魔术__call()
方法的动态类。问题是,因为我在已经存在的框架(Kohana)的基础上构建了它,所以它检查类的方法是否存在使用ReflectionClass::hasMethod
,并且它似乎没有触发__call()
魔术方法来检查它是否存在。我能在这种情况下做什么?似乎如果你动态添加方法(如$this->{$name} = function(){}
)它仍然不能“看到”它PHP ReflectionClass hasMethod和__call()
3
A
回答
2
没有更多的细节,我不确定这是否足够,但是你可以创建代理类来执行中间功能:
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()
时,它会首先对动态附加的方法进行查找;如果它找到一个,它会调用它。否则,它只会委托给内部对象。
现在,这种方法的问题是附加的方法没有绑定到代理。换句话说,$this
不存在于附加方法的范围内。
这可以通过PHP 5.4+的功能来解决。
public function setMethod($name, Closure $method) {
$this->_methods[(string) $name] = Closure::bind($method, $this);
}
我们已经细化到setMethod
向rebind the passed closure代理。现在,在附加方法的范围内,$this
将指向代理对象。
我们可以将它反弹回所包含的对象,但随后附加的方法无法与代理(或其他附加方法)通信。为了完整起见,你要添加__get
和__set
魔术,转发属性访问/突变调用内部对象(或代理处理它们,无论)
此外,内部的对象有没有关于线索代理,所以它的方法(类定义中的)无论如何都不会知道任何这种动态魔术。
1
好像如果你动态地添加的方法(如
$this->{$name} = function(){})
它仍然无法“看到”它
权,因为你正在创建一个新的财产,而不是一个方法。在在写作时,PHP不支持在属性中调用匿名函数,而不通过__call
,这不是反射友好的。在PHP 5.4中,使用匿名函数作为方法的功能可以正常工作
唯一的其他以Refl的方式将方法添加到类中的方法ection将会采用highly experimental "runkit" extension。
相关问题
- 1. PHP ReflectionClass
- 2. 为什么__invoke不会显示在ReflectionClass :: getMethods结果中,但是ReflectionClass :: hasMethod(“__ invoke”)返回true?
- 3. Codeigniter模型中的ReflectionClass
- 4. 试图了解ReflectionClass在PHP
- 5. PHP中静态的ReflectionClass?
- 6. ReflectionClass投到“正常”类
- 7. PHP ReflectionClass是一个单例吗?
- 8. ReflectionClass引入了什么版本的PHP?
- 9. Cunstructor调用失败使用ReflectionClass在php
- 10. PHP SoapClient的__call()异常:DTD不由SOAP
- 11. 的Python __getattribute__(或__getattr__)来模拟PHP __call
- 12. __call magic在PHP中创建新类
- 13. 类似于PHP的__call()在Actionscript
- 14. PHP:__call不能正常工作
- 15. PHP关于子类魔术方法__call
- 16. PHP:用__call覆盖父级方法
- 17. 使用__call()文档化的PHP类
- 18. PHP:__call调用,而不是__callStatic
- 19. 什么是ReflectionClass :: IS_IMPLICIT_ABSTRACT用于?
- 20. PHP PSR-1通过__call和__callStatic,这太难看了吗?
- 21. 误差newInstanceArgs在ReflectionClass
- 22. 动态函数参数和使用__call
- 23. 魔术函数__call()函数?
- 24. 为什么getProperty通过PHP ReflectionClass返回null
- 25. PHP:从静态方法使用ReflectionClass获取类常量
- 26. 使用__call与静态类?
- 27. Nodejs:__call实现可用?
- 28. codeigniter库中的__call函数
- 29. 覆盖雄辩/模型__call
- 30. 在PHP触发__call(),即使存在方法