On 16/10/12 22:34, Clint Priest wrote:

-----Original Message-----
From: Stas Malyshev [mailto:smalys...@sugarcrm.com]
Sent: Tuesday, October 16, 2012 6:06 AM
To: Clint Priest
Cc: Nikita Popov (nikita....@gmail.com); internals@lists.php.net
Subject: Re: [PHP-DEV] [PHP-DEV [RFC] Property Accessors v1.2 : Interfaces

Hi!

that supports properties in interfaces.  Again, not exhaustive either
but there is one language that does support accessors in interfaces
and that's C#.
So what C# does when mixing regular properties and accessorized properties?
I'd have to do some research to know for sure, but it's highly likely that they 
cannot be mixed.
Think about it, if you allowed an outside caller of your class to
modify your internal state, any time you needed to use that internal
state you would have to validate it before you could rely upon its
value to be set correctly.  No such issue exists with accessors in an
I do not see why this assumption is made that I need to do some special 
validation each time state is changed. In fact, in 99% of
existing code it is not happening, and I assume this ratio will be kept even 
when accessors are available. Most code will be very
straightforward, not doing anything complex with the state.
If you have a public property $a which internally can only deal with it being 
set to 2 or 3 and someone external to the class sets it to 4, your class either 
has to check that it's 2 or 3 and deal with the fact that it is now 4 or have 
indeterminate results when it is set to 4.

Now, I think the bigger question is: what exactly you want to say/require when 
you write:

interface a { public $xyz { get; } }

and what is the use case for this requirement?
The use case is that you are declaring that interface a must allow a property 
$xyz to be readable and *not* writable.

Just to be a bit more concrete here, as the code is presently written
and because I have strongly separated the concept of a property vs an
accessor, this code:

interface a { public $xyz { get; } }

class b implements a { public $xyz; }

Produces the following error: Fatal error: Class b contains 3 abstract
accessors and must be declared abstract or implement the remaining
accessors (get a::$xyz, isset a::$xyz, ...) in %s on line %d
I think this is wrong. 3 abstract accessors is especially wrong since it 
doesn't match the direct interface definition and is very
confusing (see my earlier point about isset/unset always having fallback 
defaults) but even with get as abstract I do not see a valid
use case that would require such behavior. What you want is for any $foo that 
is instanceof a to be able to respond to read request
to $foo->xyz, right? Class b satisfies this requirement, why you reject it then?
Also, if you reject it - how I should fix it to make it work? Would I have to 
implement a bolierplate getter/setter just to make
interface work? Doesn't look like a good proposition to me.
Class b does not satisfy the requirement because you are missing the fact that 
public $xyz { get; } forbids setting of $xyz, only reading it.


That doesn't make sense. An implementation has to have the same or less restricted visibility, so the above should work. The inverse however should not:

interface a { public $xyz; }

class b implements a { public $xyz { get; }}


Daivd

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

Reply via email to