Good developers research and find *best* ways to use the available tools
before inventing new ones.


On Mon, May 6, 2013 at 2:46 PM, Rasmus Schultz <ras...@mindplay.dk> wrote:

> Well, I don't disagree as such - there's any number of (mostly bad) ways
> to work around missing language features...
>
>
> On Mon, May 6, 2013 at 1:12 PM, Seva Lapsha <seva.lap...@gmail.com> wrote:
>
>> BTW, I didn't propose to wrap any use of a property reference into a meta
>> object, in this case a certain distinguishable string format could
>> represent it with no extra handling.
>>
>>
>> On Mon, May 6, 2013 at 12:44 PM, Rasmus Schultz <ras...@mindplay.dk>wrote:
>>
>>> Seva,
>>>
>>> I understand that you can reference properties more consistently
>>> using "{fullClassName}::{fieldName}" notation, but it's still a string, and
>>> although it's now almost practically safe to assume that strings formatted
>>> in that way are property-references, it still doesn't address the problem
>>> in a way that is elegant or expressive.
>>>
>>> I don't think the Symfony component could have done a much better job
>>> under the circumstances, at least not without the sacrifice of readable
>>> code - typing out new PropertyReference($object, 'User::$name') sure would
>>> be clunky, and not even really safe, since you can't guarantee that the
>>> class-name of $object is known, and in every property-reference, the User
>>> class-reference is now embedded statically in every property-reference, in
>>> the form of a string.
>>>
>>> I think this is a good example of those times when PHP developers tend
>>> to look far, far away from Java - as far away as possible - for solutions
>>> that are elegant and a good fit for PHP.
>>>
>>> new PropertyReference($object, 'User::$name') contains two static
>>> references too many, to both PropertyReference and User.
>>>
>>> As opposed to ^$user->name which contains the minimum amount of required
>>> information - the object and property-name, nothing else.
>>>
>>>
>>> On Mon, May 6, 2013 at 12:08 PM, Seva Lapsha <seva.lap...@gmail.com>wrote:
>>>
>>>> Hi Rasmus,
>>>>
>>>> I agree with you that strings are not the best way to refer to an
>>>> element sometimes. However, to me your Symfony2 example only demonstrates
>>>> the flaw of the component's design decision, not the limitation of the
>>>> language. Sometimes developers (not just Symfony, but other frameworks too)
>>>> don't hesitate to use contextless strings to refer to meta-data, because
>>>> they underestimate the importance of keeping static referability of static
>>>> entities. If they would use conventional full notation of references, e.g.
>>>> "{fullClassName}::{fieldName}" in a string, this would solve your initial
>>>> problem (and allow static analyzers which could be aware of the context of
>>>> the framework to do their job). This is how these kind of dilemmas are
>>>> solved in the world of Java for instance, where property references don't
>>>> exist too.
>>>>
>>>> Regards,
>>>> Seva
>>>>
>>>>
>>>> On Tue, Apr 30, 2013 at 6:24 PM, Rasmus Schultz <ras...@mindplay.dk>wrote:
>>>>
>>>>> Any PHP dev who works with a mainstream framework does this daily, but
>>>>> the
>>>>> frameworks rely on strings for property-names.
>>>>>
>>>>> Take this example from the Symfony manual, for example:
>>>>>
>>>>>
>>>>>         class Task
>>>>>         {
>>>>>             protected $task;
>>>>>
>>>>>             protected $dueDate;
>>>>>
>>>>>             public function getTask()
>>>>>             {
>>>>>                 return $this->task;
>>>>>             }
>>>>>             public function setTask($task)
>>>>>             {
>>>>>                 $this->task = $task;
>>>>>             }
>>>>>
>>>>>             public function getDueDate()
>>>>>             {
>>>>>                 return $this->dueDate;
>>>>>             }
>>>>>             public function setDueDate(\DateTime $dueDate = null)
>>>>>             {
>>>>>                 $this->dueDate = $dueDate;
>>>>>             }
>>>>>         }
>>>>>
>>>>>         $form = $this->createFormBuilder($task)
>>>>>             ->add('task', 'text')
>>>>>             ->add('dueDate', 'date')
>>>>>             ->getForm();
>>>>>
>>>>> In this example, 'task' and 'dueDate' are property-references - except
>>>>> of
>>>>> course that, no, they're not - they're obviously just strings...
>>>>> rewriting
>>>>> this example to use a (fictive) form builder API with static
>>>>> property-references:
>>>>>
>>>>>         $form = $this->createFormBuilder()
>>>>>             ->add(^$task->task, 'text')
>>>>>             ->add(^$task->dueDate, 'date')
>>>>>             ->getForm();
>>>>>
>>>>> We now have static property-references, which means the codebase can be
>>>>> proofed using static analysis, which also means better IDE support with
>>>>> property auto-completion, inline documentation, and automatic
>>>>> refactoring
>>>>> for operations like renaming properties, etc.
>>>>>
>>>>> Note that $task need not be passed to createFormBuilder() anymore -
>>>>> instead, we can now use PropertyReference::getObject() inside the
>>>>> form-builder to obtain the instance.
>>>>>
>>>>> For that matter, we can now scrap the form-builder entirely and
>>>>> introduce a
>>>>> simple form-helper in the view instead:
>>>>>
>>>>>     Task name: <?= $form->textInput(^$task->task) ?>
>>>>>     Due Date: <?= $form->dateInput(^$task->dueDate) ?>
>>>>>
>>>>> This is even better, because we now have the same level of IDE support
>>>>> and
>>>>> static analysis for textInput() and dateInput() which were previously
>>>>> unchecked strings.
>>>>>
>>>>> Or even simpler:
>>>>>
>>>>>     Task name: <?= $form->input(^$task->task) ?>
>>>>>     Due Date: <?= $form->input(^$task->dueDate) ?>
>>>>>
>>>>> Using PropertyReference::getObject() and reflection inside the
>>>>> form-helper's input() method, we can now use property-annotations to
>>>>> specify the input-type. This is a matter of preference of course, but
>>>>> use
>>>>> of annotations in Symfony is pretty popular.
>>>>>
>>>>> This is just one example - most PHP devs (at least those who do PHP
>>>>> for a
>>>>> living) use form abstractions and object/relational-mappers of some
>>>>> sort,
>>>>> so this has practical applications for practically everyone,
>>>>> everywhere.
>>>>>
>>>>> Rasmus Lerdorf wrote:
>>>>>
>>>>> It is certainly not worth overloading the XOR operator for
>>>>>
>>>>>
>>>>> Are we really going to quibble about syntax? This adds nothing to this
>>>>> discussion. And as I explained earlier, the ^ operator is used for the
>>>>> sake
>>>>> of discussion only - if it's more practical to use another character
>>>>> for
>>>>> this operator, I don't care what it looks like.
>>>>>
>>>>>
>>>>> On Tue, Apr 30, 2013 at 4:58 PM, Stas Malyshev <smalys...@sugarcrm.com
>>>>> >wrote:
>>>>>
>>>>> > Hi!
>>>>> >
>>>>> > > I'm proposing we need a way to statically reference an object
>>>>> property -
>>>>> > > the object property itself, not it's value:
>>>>> >
>>>>> > You probably have use case for that, and it should be pretty easy to
>>>>> > write a class that does that, but why it should be in the language?
>>>>> It
>>>>> > certainly doesn't look like something sizeable portion of PHP devs
>>>>> would
>>>>> > do frequently.
>>>>> >
>>>>> > --
>>>>> > Stanislav Malyshev, Software Architect
>>>>> > SugarCRM: http://www.sugarcrm.com/
>>>>> > (408)454-6900 ext. 227
>>>>> >
>>>>>
>>>>
>>>>
>>>
>>
>

Reply via email to