I would say that the proposed accessors is what we should have added back then instead of __get/__set . The problem is that now we will have two similar (albeit one is an ugly subset of the other) feature which needs to co-exists. My gut tells me that we should ditch the magic method approach with the introduction of accessors and provide easy/automated migration. Ofc. that would mean that we need at least one major version. My two cents from the sidelines. 2012.10.28. 3:39, "Larry Garfield" <la...@garfieldtech.com> ezt írta:
> On 10/26/2012 05:37 AM, Clint Priest wrote: > >> I'm opening up several new threads to get discussion going on the >> remaining "being debated" categories referenced in this 1.1 -> 1.2 change >> spec: >> https://wiki.php.net/rfc/**propertygetsetsyntax-as-** >> implemented/change-requests<https://wiki.php.net/rfc/propertygetsetsyntax-as-implemented/change-requests> >> >> ------------------------------**------------------------------** >> ------------ >> Some people are in favor of the internal functions being generated by an >> accessor declaration should be invisible and non-callable directly. Others >> are in favor of leaving them visible and callable. >> >> *Type 1 ( Userland Programmer )** >> * >> As a userland programmer, someone who cares nothing for "how" php works, >> only how their own code works. If they define an accessor they expect to >> see an accessor, reflection should reflect that there are accessors and no >> other "methods" they did not explicitly define. If they were to reflect on >> all of the methods of their class and see a number of __getHours() they may >> be confused as to why or where this function came from. From their >> perspective, they have defined an accessor and "how" that accessor works on >> the inside is of no importance to them and only seeks to complicate or >> confuse matters when they are exposed to these "implementation details" of >> the php language its-self. If you tried to set a value such as $obj?abc = 1 >> through an accessor which could not be set, you would probably want to see >> an error like: Warning, cannot set Class?abc, no setter defined. >> >> *Type 2 ( Internals Programmer )** >> * >> As an internals programmer, you want nothing hidden from you. If an >> accessor implements special __getHours() methods to work its magic, then >> you want to see them, you want to call them directly if you so choose. In >> effect you want nothing hidden from you. In this case you probably don't >> even want Reflection to reflect accessors as anything different than >> specially formatted and called methods on the class. This can be >> understandable because you want all information available to you. You would >> probably not be confused if you wrote $obj?abc = 1 and got back an error >> like "Fatal Error: Class->__setAbc() function does not exist. >> >> *Unfortunately 80 to 95% of all people who use PHP are of the first >> type.** >> * >> Revealing these internal matters to them would only leave them confused, >> possibly frustrated and likely asking about it to the internals mailing >> list to answer (repeatedly). >> ------------------------------**------------------------------** >> ------------ >> >> Thoughts? >> >> > Speaking as a user-land programmer that's been following this thread, but > hasn't been able to jump in yet due to the high volume of comments... > > What's unclear to me is what my mental model should be for this new > syntax. That's important for informing how it should be exposed to me. > > 1) Should I have a mental model of this being some syntax candy on top of > existing properties? Vis, this is just a short-hand for bean-style > classes? By Bean style, I mean Properties that would be public but aren't > because Public Is Bad(tm), so instead we have getX()/setX() for every > property, so that we can still use the object like a struct rather than an > object but still say we're using methods even though we've just > reimplemented public properties with more verbose syntax. (Note: Yes, I > know that's a rather harsh and judgmental description. I happen to firmly > dislike Bean-style objects.) > > 2) Should I have a mental model that these fancy-pants properties are some > different third thingie on objects, distinct from traditional data members > and methods? > > Right now I'm not sure which mental model I'm supposed to use, and I get > the sense that there's no clear consensus on that question yet. That, I > think, is the key question, and will inform how things like Reflection > should expose data about this new syntax. > > For instance, if model 2 is how I'm supposed to be thinking, then I'd > expect I'd need a third reflection object for getting things off of an > object/class, separate from traditional data members and methods. Then > it's consistently a third thingie. If, however, I'm supposed to think of > it as just a short-hand syntax for writing a bean, then I'd expect it to be > presented to me as if I'd hand-written all of the stuff that this syntax is > emulating. Vis, methods show up as methods, and anything I'd be able to > read/write directly without going through an intermediary method should > show up as a property just as it does now. > > Note: I'm speaking here of the mental model of the user, which does not > necessarily have any relationship to the implementation details. If I'm > "supposed" to think of it as a third thingie, it doesn't matter that it may > be implemented internally as syntactic sugar. It should be presented to me > as a third thingie, consistently, with the engine internal implementation > details completely irrelevant. (Which means they can be changed later if > needs be.) > > I don't know which mental model is intended, nor which one would be > better, but that is, I believe, the question that should inform the rest of > these discussions. > > --Larry Garfield > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > >