从父母访问受儿童保护的成员

时间:2018-04-05 14:01:43

标签: php oop

我注意到在PHP中,以下代码无需投诉:

class A {            
    public static function echoes($b) {
        echo $b->protectedFunction();
    }        
}

class B extends A {
    protected function protectedFunction() {
        return "this is protected";
    }
}

$b = new B();
A::echoes($b);

示例https://3v4l.org/JTpuQ

但是我已经在C#中尝试了这个并且它不起作用,因为父母无法访问受子保护的成员。

我的问题是谁在这里得到了OOP原则?我已经通读了LSP,但它似乎并不关心父类,所以父母访问受子保护的成员(如PHP假定它)或者是否应该受到限制(如C#假设)是正确的它应该是)?

3 个答案:

答案 0 :(得分:2)

C#限制访问的方式似乎是最合理的方式。

父母不应该从孩子那里继承任何东西。如果没有从孩子那里继承任何东西,父母就不应该访问孩子的受保护方法。

答案 1 :(得分:1)

我认为你可能会遇到问题,让父母知道关于孩子的事情。因为父类用于从多个类中提取和捆绑行为和属性,所以信息的方式只是一个方向。

也许在某些情况下您需要访问受保护的属性,但我想无论何时不需要它都可以避免它。

答案 2 :(得分:0)

PHP是一种动态类型语言。在实际执行该行代码之前,不会检查函数和方法调用。在PHP中,您可以使用不同的方法从同一个类中获得两个对象实例。 This works fine.

像C#这样的静态类型语言需要在执行之前知道对象的类型。您仍然可以use reflection to call children methods from the parent,但无法动态添加新方法。