Re: Property Accessors v1.2
| From: | Clint Priest | Date: | Sun, 14 Oct 2012 03:22:55 +0000 |
| Subject: | Re: Property Accessors v1.2 | ||
| References: | 1 2 3 4 5 6 7 8 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-63398@lists.php.net to get a copy of this message | ||
-Clint
On Oct 13, 2012, at 4:21 PM, "Amaury Bouchard" <amaury@amaury.net<mailto:amaury@amaury.net>> wrote:
2012/10/13 Clint Priest <cpriest@zerocue.com<mailto:cpriest@zerocue.com>>
Interfaces are used to define what methods must be present, properties are not allowed.
Yes, so no one should be correct, right?
I mean, yes the first declaration implies some code; but for the interface, it's still a
property definition.
You’re mixing concepts here, it’s an accessor definition, not a property definition. property
!= accessor, an accessor just happens to look and act like a property (which is the point of
accessors).
Interfaces define methods, not properties. Fine.
But is an accessor (as defined in the RFC) a method? Or should we consider that an accessor
definition is valid inside an interface? I would say no, because it will be used as a property:
outside of the object that implements the accessor, nobody know if it's an attribute or an
accessor function.
It's the whole point of the RFC (apart from the asymetric visibility, but you know my point of
view).
So, for me, this code should be incorrect:
interface Fooable {
public $abc { get; set; }
}
Because if an object implements the interface:
class Fooer implements Fooable {
public $abc {
get { /* what you want */ }
set { /* what you want too */ }
}
}
How this code will be used? Like that:
$foo = new Fooer();
$foo->abc = 3;
print($foo->abc);
Everybody will agree with me that $abc is used like a property, not as a method. So the language
should enforce that.
There is a real issue here; this is not a fad from me.
An accessor is a method and an interface which defines an accessor is indicating that the accessor
must be implemented by any using the interface.
See: http://msdn.microsoft.com/en-US/library/64syzecx(v=vs.80).aspx
Also, "used like a property" does not mean it is a property, it is a method call with the
syntax of accessing a property, it is still a method call.
I believe __get() may be declared in an interface and if so, then accessors should be as well.