Re: Property Overloading RFC

From: Date: Tue, 02 Aug 2005 14:05:30 +0000
Subject: Re: Property Overloading RFC
References: 1  Groups: php.internals 
Request: Send a blank email to internals+get-17493@lists.php.net to get a copy of this message
Derick Rethans wrote:
Hello! we're finding some problems with property overloading (__get() and __set()). Here is an RFC describing what we'd like to see changed. Please comment on this. Introduction: PHP currently supports property overloading with the magic functions __get() and __set(). Those methods are called when the code "echo $object->a" or "$object->a = 42" are executed and the property "a" is not declared in the class. The magic methods are responsibly for: - checking if the property actually "exists" - setting the value or returning the value depending on the action Problems: 1. There is no way to document the 'virtual' properties with any of the existing documentation tools (such as phpdoc and doxygen) 2. There is no way how the magic methods know if a specific 'virtual' property exists or not as those properties are not declared usually - unless you define an array with property names as a class constant (which is not allowed either). 3. There is no way for the magic methods to return a meaningfull error when a property doesn't "exist". Of course it is possible to throw an error with "trigger_error" or "throw" in case a property doesn't "exist" in a specific class, but the file and line numbers would not match the actually get/set action. debug_backtrace() can be used to retrieve the correct file and line, but as you have to do this for every class where you want to use setters and getters *and* you have to implement your own error message rendering function this is not really a suitable option either.
what about: <?php class GetSet0 { function __get($name) {} function __set($name, $value) {} } class GetSet1 { property $x; // or virtual $x, ... } class GetSet2 { property $x { __get, __set } function __get($name) {} function __set($name, $value) {} } class GetSet3 { property $x { getMethod, setMethod } function getMethod() {} function setMethod($value]) {} } ?> Features: 1) Easy way to document properties 2) No BC break with code relies on __get, __set Clases GetSet0, GetSet1 and GetSet2 are equivalent and third class GetSet3 use different methods to handle $x property; There is a nice way to declare reaonly properties property $x { getMethod } or property $x { getMethod, null } and writeonly propeties :) property $x { null, setMethod } If someone touch undeclared property and class don't have __get/__set Zend engine can raise exception ... It's good way? I don't know. -- Ondrej Ivanic (ondrej@kmit.sk)

« previous php.internals (#17493) next »