> On May 13, 2006, at 7:18 PM, Marcus Boerger wrote: > > > hehe, maybe confused with delphi or borlands c++ > additons? Speaking > > of which before we add 'readonly' we should go for full property > > support but on the other hand that might be a little bit too much > > until php is used with code generators and gui designers where code > > inspectors execute and manipulate source/code while developing. > > Hi Marcus, > > Full property support is high on my wishlist for 6.0. I was a > Delphi programmer for 5 years and miss properties. C#, Ruby, > and Java all have built in property support with accessor > methods, or at least a single standard implementation that > all the tools can get behind. > __get and __set leave you in complete limbo for both source > code and reflection based tools. I think the language > support has to come before the tools. > > I think this can be implemented by adding a getter and setter > field to zend_property_info, then checking for it in > zend_std_read_property, etc. Although, I'm sure there's more > to it than that. Such an implementation would probably be 3 > to 4 times faster than __get(). No switch, no $name > parameter, perhaps no guard logic. Checking for a getter or > setter in zend_property_info would be a fast boolean test on > a data structure thats already available, so I believe there > would be little overhead. > > Here are a few use cases and syntax suggestions... > > A. Declaring a property with accessor methods: > > public $foo read getFoo write setFoo; > > B. Read only property with accessor method could be declared: > > public $foo read getFoo; > > C. A shortcut notation could automatically generate the > accessor method based on another property: > > public $foo read $_foo; > // internally generated method ala C# property implementation: > // public function __get_foo() { return $this->$_foo; } > > D. Similar to read only, you could have split visibility, for > example, a public getter and a protected setter: > > public $foo read getFoo write protected setFoo; // Handy use > case, not crazy about this syntax public function getFoo() { > return $this->_foo; } protected function setFoo($value) { > $this->_foo = $value } > > E. To avoid warnings, declare the internal storage, too: > > public $foo read $_foo write setFoo, protected $_foo; > public $foo read $_foo, protected $_foo; // readonly > > F. Properties with accessor methods cannot be directly initialized. > Their internal storage can, however: > > public $foo read $_foo write setFoo, protected $_foo = 'bar'; > > G. calling unset() on a property with accessor methods could > call the setter with NULL. > > H. calling isset() on a property with accessor methods > returns FALSE if the property does not exist, otherwise calls > the getter and compares against NULL for compatibility purposes. (?) > > I. calling property_exists() on a property with accessor > methods would always return TRUE. > > J. The setter and getter could be inspected via ReflectionProperty. > > K. Unlike __get, subclass property definitions could override > the parent declarations: > > class Foo { public $prop; } > class Bar extends Foo { public $prop read getProp write > setProp; ... } > > L. An abstract class need not declare the actual accessor > methods, they could be added as abstract by default: > > abstract class Bar { public $foo read getFoo write setFoo; } >
Yes, full property support would be nice. Though not to keen on that syntax, but can't think of anything nicer as yet :) Haxe ( http://www.haxe.org/ref#properties ) has something like public $prop(getter, setter); Where getter and setter can be a method name, null for not allowed, default for basic accessor, which is less to type, but still not that nice. Jared -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php