Nikita, your examples convinced me that a strict "accessor methods as specialized __get/__set semantics" approach is undesirable.
To recapitulate your two examples: Example 1: class A { public $foo; } class B extends A { public $foo { get() { ...} } } Example 2: class A { public $foo { get() { ...} } } class B extends A { public $foo; } One would expect that in both cases, instances of 'class B' would have a $foo acting as declared in class B, shadowing the declaration from class A. I think that the issue might be solved by an additional, not-yet-discussed and very general extension, which is something I missed being able to do from time to time: the possibility to declare a method (or property) in some class to be explicitly NOT inherited. Syntactically, something like class C { public $bar; public function twiddle(); } class D extends C { no public $bar; no public function twiddle(); # might be followed by a different twiddle(), or $bar, implementation } The use case I have in mind, coming from the method side, is a subclass that wants to use __call() for delegation AND needs to delegate to one or more methods that are ordinarily plainly implemented in the base class. What this feature would bring to the current discussion, is this possible solution to your dilemma: 1) when a class declares a plain property "public $foo", automatically apply "no function __getfoo(); no function setfoo();" (leaving out isset/unset for clarity) 2) conversely, when a class declares "public $foo { get() {...}}", or even just declares one of the magic methods directly like "public function __getfoo() {}" - automatically prepend / pretend a "no public $foo;" cancelling a superclass property. best regards Patrick -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php