PHP继承的父方法无法访问 child 的私有(private)属性(property)

标签 php oop inheritance visibility

首先:A quite similar problem已经发布并以某种方式解决了,但仍然没有回答我的具体问题。稍后会详细介绍。

换句话说:我有一个基类,它为所有子类提供一些方法,但不包含任何属性。我的 child 正在继承这些方法,这些方法应该用于访问 child 的属性。 如果 child 的属性是 protectedpublic,一切正常,但如果 child 的属性是 private,它会失败而不会出错(什么也没有发生).

在代码中:

class MyBaseClass {
    public function __set($name, $value) {
        if(!property_exists($this, $name))
            throw new Exception("Property '$name' does not exist!");
        $this->$name = $value;
    }
}

class ChildClass extends MyBaseClass {
    public $publicProperty;
    protected $protectedProperty;
    private $privateProperty;
}

$myChild = new ChildClass();
$myChild->publicProperty = 'hello world';    //works of course!
$myChild->protectedProperty = 'hello world'; //works as expected
$myChild->privateProperty = 'hello world';   //doesn't work?

上面提到的类似问题得到了使用魔法 __set() 方法访问私有(private)属性的解决方案,但我已经在这样做了。如果我在 child 中实现 __set(),它当然可以工作,但想法是, child 从它的 parent 那里继承了 __set(),但显然它可以'访问 child 的私有(private)方法。

是故意的吗?我做错了什么吗?还是我的方法设计得很糟糕?

背景: 我最初的想法是:关于 __set() 的整个动态是我不喜欢的。通常私有(private)属性应该从不可以从外部访问,所以我在我的最终基类(所有类继承)中实现了抛出 __set- 和 __get- 方法。

现在我想从 XML 文件动态生成一个实例,因此需要访问属性。我制定了规则,任何可实例化的 XML 类都需要实现神奇的 __set() 方法,因此可以动态创建。我决定让它们从一个名为 class Spawnable { } 的类继承,而不是在某一天可能产生的每个类中实现它,它提供了所需的 __set-method。

最佳答案

这就是privateprotected的区别。无法继承或访问私有(private)方法和属性。您需要将它们改为 protected 。

参见 manual on visibility

Members declared protected can be accessed only within the class itself and by inherited and parent classes. Members declared as private may only be accessed by the class that defines the member.

关于PHP继承的父方法无法访问 child 的私有(private)属性(property),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4022313/

相关文章:

php - 相同的登录不同的空间

php - 评论和改进已经编写的程序的过程?

java - 有关混合重写声明变量和实例变量的问题?

json - 从json初始化子类

php - 如何使用php从mysql中导出数据

java - 为 Eclipse 添加 Java 支持

c++ - 场景图更新回调设计

php - (PHP) 从类代码中取消设置一个对象

r - 当 `methods` 失败时,如何判断函数调用正在使用什么方法?

python - PySide 浏览器位于单独的进程中