I agree, overloading isset() for properties is somewhat creepy - as
that would mean you can no longer rely on isset() to actually work the
way it works for any other value. I understand that's actually the
intent, but I think this would be confusing - isset() is supposed to
behave a certain way depending on the value, and now suddenly it could
return completely arbitrary values unrelated to the value of a
property, breaking established semantics.

As for unset() on the other hand - I feel that this is almost a must,
since without it, properties can't fully replace the magic methods. To
complete the example from the RFC, it would look like this:

class TimePeriod
{
    private $seconds;

    public property hours
    {
        get { return $this->seconds / 3600; }
        set { $this->seconds = $value * 3600; }
    }

    public function __unset($name)
    {
        if ($name == 'Hours') {
            unset($this->seconds);
        }
    }
}

That's pretty awful.

For that matter, if __unset() was not implemented, what would happen
if you did unset($time->Hours) ? The behavior would be undefined -
worst case, nothing would happen at all, which could lead to fun
debugging sessions, when you think you're deleting properties and they
just stay unchanged.

I would suggest making the unset-method optional for properties, and
the default behavior for unset($time->Hours) would be
$time->Hours=null when no unset-method is implemented.

The "readonly" keyword in my opinion is redundant - properties are
naturally read-only (or write-only) if you implement only the get or
set method, same as any other language. No need to break common
language conventions here.

RFC looks good though, much better than initial proposals - I like it! :-)

- Rasmus

> From: Anthony Ferrara <ircmax...@gmail.com>
> To: Clint M Priest <cpri...@zerocue.com>
> Cc: "internals@lists.php.net" <internals@lists.php.net>
> Date: Tue, 24 Apr 2012 08:56:55 -0400
> Subject: Re: [PHP-DEV] RFC: Property get/set syntax (added isset/unset and 
> references)
> Clint,
>
> Very nice job overall!  Looking quite good.
>
> >  Alternatively we could throw an error to a call on isset and/or unset 
> > against a property which didn't define an implementation.
>
> I don't care for that concept much.  All it's doing is trading one set
> of boilerplate for another.  I'd prefer the get() !== null approach,
> since there is a zval allocated for it, so the isset() part.
>
> And I do like the unset overloading, which is right inline with __unset()...

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to