PHP继承的父方法无法访问子属性的私有属性

Jan*_*Jan 10 php oop inheritance visibility

首先:一个非常相似的问题已经发布并且已经以某种方式解决了,但仍然没有回答我的具体问题.稍后会详细介绍.

用语言:我有一个基类,它为所有子项提供一些方法,但不包含任何属性.我的孩子继承了这些方法,这些方法应该用于访问孩子的属性.如果孩子的属性是protected或者public,一切正常,但是如果孩子的属性是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?
Run Code Online (Sandbox Code Playgroud)

上面提到的类似问题得到了使用魔术__set()方法访问私有属性的解决方案,但我已经在做了.如果我__set()在孩子中实现,它当然有效,但想法是,孩子继承了__set()它的父母,但显然它无法访问孩子的私人方法.

这是故意的吗?我做错了吗?或者我的方法只是废话设计?

背景: 我最初的想法是:整个动态的东西__set()是我不喜欢的东西.通常永远不能从外部访问私有属性,所以我在我的最终基类中实现了抛出__set-和__get-方法(所有类都从这些方法继承).

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

Emi*_*röm 17

这之间的区别privateprotected.无法继承或访问私有方法和属性.您需要将它们更改为受保护.

请参阅可见性手册

声明受保护的成员只能在类本身以及继承和父类中访问.声明为private的成员只能由定义该成员的类访问.

  • 你是对的!我以某种方式'想象',__ set()方法在子范围内,因为它从基类继承它.这意味着孩子想要使用父方法访问它自己的私有属性.但显然在PHP中,孩子实际上并不是从父母那里"导入"这些方法,而是只是调用它们,比如`Parent :: Method()`.因此它脱离了可见性,当然 - 只能访问公共和受保护的字段.虽然我现在知道,但这非常令人不满意.非常感谢您的帮助! (2认同)