在PHP中从类外部调用受保护的方法

时间:2009-06-11 17:33:54

标签: php access-modifiers

我有一个非常特殊的情况,我需要从类外部调用受保护的方法。我非常清楚我的编程方式,但我不会完全反对我这样做的一个特例。在所有其他情况下,我需要继续禁止访问内部方法,因此我希望保护该方法。

在课堂外访问受保护方法有哪些优雅方法?到目前为止,我找到了this

我想有可能创建某种目标类的双代理实例,它会偷偷地提供对内部的访问......

6 个答案:

答案 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');

这会绕过受保护的方法并直接转到实例变量。