我有一个非常特殊的情况,我需要从类外部调用受保护的方法。我非常清楚我的编程方式,但我不会完全反对我这样做的一个特例。在所有其他情况下,我需要继续禁止访问内部方法,因此我希望保护该方法。
在课堂外访问受保护方法有哪些优雅方法?到目前为止,我找到了this。
我想有可能创建某种目标类的双代理实例,它会偷偷地提供对内部的访问......
答案 0 :(得分:5)
在PHP中,您可以使用Reflections执行此操作。 要调用protected或private方法,请使用setAccessible()方法 http://php.net/reflectionmethod.setaccessible(只需将其设为TRUE)
答案 1 :(得分:3)
我认为在这种情况下,重构所以你不需要这种东西可能是最优雅的方式。在说一个选项是使用__call
并在该解析debug_backtrace
中查看哪个类称为该方法。然后检查朋友白色
class ProtectedClass {
// Friend list
private $friends = array('secret' => array('FriendClass'));
protected function secret($arg1, $arg2) {
// ...
}
public function __call($method, $args) {
$trace = debug_backtrace();
$class = $trace[1]['class'];
if(in_array($class, $this->friends[$method]))
return $this->$method($args[0], $args[1]);
throw new Exception();
}
}
我想我需要淋浴。
答案 2 :(得分:1)
这有点笨拙,但可能是一种选择。
为了访问受保护的功能而添加子类
public class Child extends Parent {
public function protectedFunc() {
return parent::protectedFunc();
}
}
然后,实例化Child
而不是Parent
的实例,您需要调用该函数。
答案 3 :(得分:0)
我只是把它扔到那里因为我两年没用PHP编程了。你能不能像这样调用受保护方法的类添加一个函数?
$obj->publicFunc = create_function('$arg', 'return $this->protectedFunc($arg);');
修改强>: 我认为Tom在查看create_function的文档时是正确的。当您尝试使用此示例调用它时,看起来$ this的范围将是“错误的”。
看起来自PHP 5.3.0以来也支持传统的匿名函数(我的第一个解决方案可能不起作用),所以我可能会这样写:
$obj->publicFunc = function($arg) {
return $this->protectedFunc($arg);
};
因为我认为它看起来更清洁(当然你选择的IDE会更好地突出它)。
呃,我尝试使用Reflection来调用该方法,但PHP也不允许你这样做。看起来你将不得不像其他海报所建议的那样使用某种儿童类。如果您发现一个有效的方法,开发人员可能会将其归类为未来的错误,并在升级到下一个版本时破坏您的代码。
我建议扩展课程。
答案 4 :(得分:0)
如果我必须调用私有函数,我会考虑程序设计的问题吗?
曾经是
的情况通过找到任何方式来解决这些问题,你将无法接近真正的解决方案。
答案 5 :(得分:-3)
假设您的方法声明如下:
protected function getTheFoo() {
...
}
protected function setTheFoo($val) {
...
}
用法:
$obj->__get('the_foo');
$obj->__set('the_foo', 'myBar');
这会绕过受保护的方法并直接转到实例变量。