在运行时确定方法调用的来源

时间:2012-01-29 00:14:06

标签: php oop

我想知道是否有“更好”的方法来做到这一点:

class Foo {
    final public function bar() {
        if (is_subclass_of(get_called_class(), __CLASS__)) {
            throw new Exception();
        }
    }
}

class Bar extends Foo {
    public function baz() {
        parent::bar(); // shouldn't be allowed
    }
}

基本上,我希望我的父类中的某些方法禁止子类调用它们。这需要防弹,我怀疑这是,所以如果你知道如何规避这一点,那就是我有兴趣知道的(如果可能的话,还有如何预防它)。

编辑:对于每个人都建议使用私有方法,这不是一个选项,因为我需要让界面保持公开以便外部访问。对不起,我想我认为这很明显。

3 个答案:

答案 0 :(得分:3)

这不是“防弹”。而且我认为你无法做到这一点。

事实上,PHP进程通常在一个解释器中运行,文件系统访问本地服务器 - 作为一个相对无特权的用户。但这仍然足以打开/proc/self/mem,它提供对当前进程的内存空间的读写访问。使用它,您可以进入PHP解释器正在使用的内存,并NOP覆盖您认为提供防弹安全性的代码。

答案 1 :(得分:1)

class Foo {
    final public function bar() {
        if (is_subclass_of(get_called_class(), __CLASS__)) {
            throw new Exception('No cookies for you!');
        }
        echo 'Failure!';
    }
}

class Bar extends Foo {
    public function baz() {
        try{
                Foo::bar(); // shouldn't be allowed
        } catch (Exception $e){
                echo $e->getMessage();
        }
        try{
                $func = function() {Foo::bar();}; // is allowed, nags somewhat about it should't be called statically..
                $func();
        } catch (Exception $e){
                echo $e->getMessage();
        }
    }
}
$b = new Bar();
$b->baz();

答案 2 :(得分:0)

我不确定这是否有帮助,但是父类中的私有函数不能被子类调用。但如果你需要公开我认为你必须在每个孩子中声明baz()并抛出异常......