>
> 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;

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
>

Reply via email to