On Jan 23, 2013, at 1:23 PM, Steve Clay <st...@mrclay.org> wrote:

> First of all, I think the functionality provided by Clint and Nikita's RFC 
> [1] is in demand and would be an asset to PHP, but I also think it can 
> repackaged more simply.
> 
> People are comparing the RFC to C# [2], but while they look similar, C# has a 
> simpler implementation we should learn from.
> 
> 1. C# draws a firm line between property and field, keeping both concepts 
> simple.
> 
> A "field" is like a PHP property. There's no more to understand.
> 
> A "property" is simply a set of functions emulating a field, and $value is 
> available in the setter body. There's no more to understand.
> 
> Importantly, I think, the property takes the place of a field; there's never 
> a "shadow" field of the same name to think about. The obvious downside is you 
> must use a distinctly-named field for storage, but the upside is conceptual 
> and behavioral simplicity. There's no need for "guarding" mechanisms and 
> rules about where "$this->prop" will mean field access or trigger 
> getter/setter; we know there is no field "prop", period.
> 
> As Sharif Ramadan pointed out, it also makes state snapshots clearer as there 
> is no value stored under "prop" to potentially confuse. Under the RFC, every 
> property would show up as a field *even if the accessors didn't use that 
> field*.
> 
> 2. C# has no issetter/unsetter.
> 
> IMO customizing these functions is completely unneeded for the vast majority 
> of use cases and could be replaced by simpler logic: isset($this->prop) calls 
> the getter and compares to NULL; unset($this->prop) passes NULL to the setter.
> 
> 3. C# has no auto-implementations.
> 
> IMO auto implementations have some value removing boilerplate, but we should 
> not make them violate #1. We could have the property syntax specify what 
> field to use for underlying storage, or simply conclude that the boilerplate 
> is worth the clarity.
> 
> 
> I think the path forward is to determine how we can serve the same goals as 
> this RFC, but retain the conceptual simplicity of the C# implementation and 
> maybe syntax that strays less from current PHP.
> 
> I have some ideas that I could start forging into an RFC. Consider this:
> 
> class Foo {
>  private $_bar;
>  public function get bar { return $this->_bar; }
>  public function set bar { $this->_bar = $value; }
> }
> 
> Advantages I see over the RFC:
> * It's clearer that the accessors map to regular methods, and you know how to 
> control visibility of methods and how they're inherited.
> * It's clearer $bar doesn't exist as a property, and it will never show up in 
> state inspection.
> * You know $_bar is a plain PHP property, and you can initialize it directly 
> in the constructor; we don't need an "initter".
> * There are no guards/proxies/shadow property to think about
> 
> As for type-hinting, I think that could be achieved by a separate, simpler 
> mechanism: type-hinting the properties.
> 
> class Foo {
>  private Bar? $_bar;
> }
> 
> $_bar is a regular property, but which can only be set to a Bar or to null 
> ("?" implies nullable). That gives you simple typed properties (useful and 
> simpler to understand without accessors), but also suggests how to combine 
> these to get "typed accessors":
> 
> class Foo {
>  // settable anywhere
>  public Bar $bar;
> 
>  // "read only"
>  protected Baz? $_baz;
>  public function get baz { return $this->_baz; }
> }
> 
> 
> Down the road we could further address how to shorten this syntax but while 
> keeping it clear that accessors are just functions and properties are just 
> value stores.
> 
I'd just like to point out the fact that RFC v1.1 from a year ago was exactly 
as above but people wanted all of these other features.  They were not a 
property, they had no "guarding", no unset, isset, etc. 

The original RFC that was exactly as c# had it, nobody liked it.

It was changed to its current incarnation because it now mimics exactly what 
everyone is use to with __get(), etc.

> 
> [1] https://wiki.php.net/rfc/propertygetsetsyntax-v1.2
> [2] http://msdn.microsoft.com/en-us/library/x9fsa0sw(v=vs.80).aspx
> 
> Steve Clay
> -- 
> http://www.mrclay.org/
> 
> -- 
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
> 

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to