我想知道是否有“更好”的方法来做到这一点:
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
}
}
基本上,我希望我的父类中的某些方法禁止子类调用它们。这需要防弹,我怀疑这是,所以如果你知道如何规避这一点,那就是我有兴趣知道的(如果可能的话,还有如何预防它)。
编辑:对于每个人都建议使用私有方法,这不是一个选项,因为我需要让界面保持公开以便外部访问。对不起,我想我认为这很明显。
答案 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()
并抛出异常......