【发布时间】:2011-04-30 15:43:24
【问题描述】:
首先:quite similar problem 已发布并已以某种方式解决,但仍未回答我的具体问题。稍后再详细介绍。
一句话:我有一个基类,它为所有孩子提供一些方法,但不包含任何属性。我的孩子正在继承这些方法,这些方法应该用于访问孩子的属性。
如果孩子的属性是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?
上面提到的类似问题得到了使用魔术__set() 方法访问私有属性的解决方案,但是我已经在这样做了。如果我在子级中实现__set(),它当然可以工作,但想法是,子级从其父级继承__set(),但显然它无法访问子级的私有方法。
这是故意的吗?我做错了什么吗?还是我的方法只是设计使然?
背景:
我最初的想法是:关于__set() 的整个动态是我不喜欢的。通常,私有属性永远不能从外部访问,因此我在我的最终基类(所有类都继承自该基类)中实现了抛出 __set- 和 __get-methods。
现在我想从 XML 文件动态生成一个实例,因此需要访问属性。我制定了规则,任何 XML 可实例化的类都需要实现神奇的 __set() 方法,因此可以动态创建。我决定让它们继承自一个名为 class Spawnable { } 的类,它提供了所需的 __set-method,而不是在每个可能产生的类中实现它。
【问题讨论】:
-
这不应该工作...这个
$myChild->protectedProperty = 'hello world';应该产生一个致命错误...与privateProperty 相同。 php.net/manual/en/language.oop5.visibility.php
标签: php oop inheritance visibility