On Thu, May 2, 2013 at 2:07 AM, Rasmus Schultz <ras...@mindplay.dk> wrote:
> > I believe you have difficulties explaining these benefits because you > first need to argue why you want reflected properties all over the place. > And once that is established (assuming it is), why you would need dedicated > syntax for it. > > I thought that's what I had been doing? Apparently I've just been writing > up long e-mails about nothing. > > I don't understand your line of argumentation at all - strings are fine > and literal references to properties refactor just as well? > > Okay. > > Let's go ahead and quit using the new-statement then, because we don't > really need literal references to class-names - we can just do this instead: > > function create($class_name) > { > return new $class_name; > } > > $user = create('User'); > > $user->name = 'xyz'; > > See how far you'll get with static analysis when you don't even know the > class of an object anymore. Solong to any kind of static analysis whatsover. > If this was an idiom in PHP, I'm sure static analyses would be built with enough interprocedural reasoning to handle that case just fine. > > Let's get rid of the instanceof-operator while we're at it, this works > just as well: > > if (get_class($user) === 'User') { > // yay! > } > > You are correct, we don't technically need literal references to anything. > > Forget the whole thing. > > I'm going to build every app in Drupal from now on, where everything is a > string or an array or a stdClass - at least then there's consistently no > checkable literals or IDE support for anything. > > We have User::class now instead of 'User'. You should use it, it makes it easy to refactor and stuff. More seriously: I'm just saying you are arguing for a *new* syntax that would allow something rarely used (IMO) to be, as I see it: easier to analyze or refactor; that doesn't qualify(IMO, again) as important enough to warrant a syntax change. > Awesome. > > > On Wed, May 1, 2013 at 5:12 PM, Etienne Kneuss <col...@php.net> wrote: > >> >> >> >> On Wed, May 1, 2013 at 7:13 PM, Rasmus Schultz <ras...@mindplay.dk>wrote: >> >>> The only reason being that the syntax "^$user->name" is "more static" >>>> than new PropertyReference($user, 'name'), and thus easier to refactor? >>> >>> >>> Not "more static", it is static - a string-based property-reference is >>> not. >>> >> >>> Refactoring isn't the only benefit - of course most of the benefits are >>> going to come from IDE support, but would include things like inline >>> documentation, auto-complete and warnings/errors based on static >>> analysis/inspections. I already covered that. >>> >> >> >>> PHP-based code-analysis tools would also be able to do a better job when >>> checking views etc. - if you're using PHP-based static analysis tools to >>> check for code-smells etc. there's a good chance you have it configured to >>> skip your view-template folders... >>> >> >>> >> >> I am sorry, but I find very hard to believe that a "^" preceeding a >> property access is going to make things easier for any static analysis, and >> I have done my share of them. >> >> If you look even at the syntax tree, it is not any harder to track new >> ReflectionProperty($obj, "property") than it is to track ^$obj->property, >> and that is a fact. You basically have a string literal instead of a >> T_STRING. >> You might argue that the property name does not need to be a string >> literal, but then what about ^$foo->$bar or ^$foo->{'asd'}? would that be >> forbidden? >> >> To me they really look equivalent from a refactoring point of view. >>> >>> >>> They are not. >>> >> >>> Refactoring based on strings is guesswork - it's slow when working with >>> a large codebase, and it's error-prone, and therefore requires manual >>> review of every change before you apply, even for things that should be >>> quick/simple like renaming a property. >>> >> >> Refactoring in PHP will always be guesswork, error-prone, and will >> require manual inspection, whether you have a fancy syntax to create >> ReflectionProperies or not. Types are hard to track statically and that >> won't change with this. And really, the strict translation of ^$obj->foo is >> just as easy (and fast) to track by analyses. >> >> >>> In any case, as many already pointed out, this sounds like a lot of pain >>>> for really little (if any) gain. >>> >>> >>> Going to take a wild guess and say your IDE or text-editor does not do >>> static analysis? >>> >> >>> Yes, there is little immediate gain from the feature itself - but as >>> demonstrated, valuable long-term gain from being able to write simpler, >>> stronger abstractions that provide more comfort and safety in an IDE. >>> >> >> I believe you have difficulties explaining these benefits because you >> first need to argue why you want reflected properties all over the place. >> And once that is established (assuming it is), why you would need dedicated >> syntax for it. >> >> If reflected properties is a big thing, I'm sure "IDE support" is as easy >> to implement with or without this new syntax. >> >> Introducing new syntax must be done with extreme care, and so far this >> case looks quite far from convincing. >> >> >> >>> On Wed, May 1, 2013 at 10:24 AM, Etienne Kneuss <col...@php.net> wrote: >>> >>>> >>>> >>>> >>>> On Wed, May 1, 2013 at 2:35 PM, Rasmus Schultz <ras...@mindplay.dk>wrote: >>>> >>>>> > >>>>> > This is a fringe feature, as evidenced by the fact that you >>>>> > are having a hard time convincing people that it is needed >>>>> >>>>> >>>>> As with anything that isn't already established and well-known, it's >>>>> hard >>>>> to convince anyone they need anything they don't understand - I think >>>>> the >>>>> barrier here is me having difficulty explaining a new idea/concept. >>>>> That >>>>> doesn't make it a fringe feature - I have already demonstrated by >>>>> example >>>>> how this would be useful in practically every mainstream framework. >>>>> >>>>> Properties simply don't carry >>>>> > this information with them so a lot of things would have to change >>>>> > internally for this to ever work >>>>> >>>>> >>>>> I'm not sure what information you're referring to? >>>>> >>>>> Let's say for the sake of argument, I'm going to use a pre-processor to >>>>> transform the following code: >>>>> >>>>> $prop = ^$user->name; >>>>> >>>>> var_dump($nameprop->getValue()); // => 'Rasmus' >>>>> >>>>> $nameprop->setValue('Bob'); >>>>> >>>>> var_dump($nameprop->getValue()); // => 'Bob' >>>>> >>>>> The pre-processor output might look like this: >>>>> >>>>> $nameprop = new PropertyReference($user, 'name'); // $prop = >>>>> ^$user->name; >>>>> >>>> >>>> >>>> So basically you want to introduce syntactic sugar for: >>>> >>>> new PropertyReference($user, 'name') >>>> >>>> The only reason being that the syntax "^$user->name" is "more static" >>>> than new PropertyReference($user, 'name'), and thus easier to refactor? To >>>> me they really look equivalent from a refactoring point of view. >>>> >>>> In any case, as many already pointed out, this sounds like a lot of >>>> pain for really little (if any) gain. >>>> >>>> >>>>> >>>>> var_dump($nameprop->getValue()); // => 'Rasmus' >>>>> >>>>> $nameprop->setValue('Bob'); >>>>> >>>>> var_dump($nameprop->getValue()); // => 'Bob' >>>>> >>>>> Only the first line changes - the rest behaves and runs like any >>>>> normal PHP >>>>> code. >>>>> >>>>> And the PropertyReference class could be implemented in plain PHP like >>>>> this: >>>>> >>>>> class PropertyReference >>>>> { >>>>> private $_object; >>>>> >>>>> private $_propertyName; >>>>> >>>>> public function __construct($object, $propertyName) >>>>> { >>>>> $this->_object = $object; >>>>> $this->_propertyName = $propertyName; >>>>> } >>>>> >>>>> public function getObject() >>>>> { >>>>> return $this->_object; >>>>> } >>>>> >>>>> public function getPropertyName() >>>>> { >>>>> return $this->_propertyName; >>>>> } >>>>> >>>>> public function getValue() >>>>> { >>>>> return $this->_object->{$this->_propertyName}; >>>>> } >>>>> >>>>> public function setValue($value) >>>>> { >>>>> $this->_object->{$this->_propertyName} = $value; >>>>> } >>>>> >>>>> // and maybe: >>>>> >>>>> public function getReflection() >>>>> { >>>>> return new ReflectionObject($this->_object); >>>>> } >>>>> } >>>>> >>>>> >>>>> You can see the above example running in a sandbox here: >>>>> >>>>> >>>>> http://sandbox.onlinephpfunctions.com/code/87c57301e0f6babb51026192bd3db84ddaf84c83 >>>>> >>>>> Someone said they didn't think this would work for accessors, so I'm >>>>> including a running sample with a User model that uses accessors: >>>>> >>>>> >>>>> http://sandbox.onlinephpfunctions.com/code/f2922b3a5dc0e12bf1e6fcacd8e73ff80717f3cb >>>>> >>>>> Note that the dynamic User::$name property in this example is properly >>>>> documented and will reflect in an IDE. >>>>> >>>>> >>>>> On Tue, Apr 30, 2013 at 8:43 PM, Rasmus Lerdorf <ras...@lerdorf.com> >>>>> wrote: >>>>> >>>>> > On 04/30/2013 05:17 PM, Rasmus Schultz wrote: >>>>> > >>>>> > > If the asterisk (or some other character) offers and easier >>>>> > > implementation path, whatever. >>>>> > >>>>> > It doesn't. This is a fringe feature, as evidenced by the fact that >>>>> you >>>>> > are having a hard time convincing people that it is needed, and thus >>>>> > shouldn't overload an existing operator. Visually it would be >>>>> confusing >>>>> > to take any well-known operator and give it a different obscure >>>>> meaning. >>>>> > But yes, syntax-wise ^ could be made to work, the implementation >>>>> problem >>>>> > I referred to is lower-level than that. Properties simply don't carry >>>>> > this information with them so a lot of things would have to change >>>>> > internally for this to ever work and if a clean implementation could >>>>> be >>>>> > found, like I said, adding it to the reflection functions is the >>>>> proper >>>>> > place. >>>>> > >>>>> > -Rasmus >>>>> > >>>>> >>>> >>>> >>>> >>>> -- >>>> Etienne Kneuss >>>> http://www.colder.ch >>>> >>> >>> >> >> >> -- >> Etienne Kneuss >> http://www.colder.ch >> > > > -- Etienne Kneuss http://www.colder.ch