On 1/2/13 6:08 PM, Clint Priest wrote:
Sorry, there was a typo in that RFC there, this line:
         isset { return $this->Hours != NULL; }
Should have been with !==:
         isset { return $this->Hours !== NULL; }

I've already updated the 1.2 doc to reflect the correct way.

Given what I mentioned above, I'm assuming you did not test this with the fork, 
right?
Just based your comments on how it should logically work (with the incorrect != 
vs !==?)

I haven't tested the fork. I just borrowed your logic with the typo :)

One last thing about that, the isset/unset with $this->Hours calls the getter 
to retrieve
the $this->Hours value, so it behaves as your example below indicates.

The RFC says, "only the accessors themselves may directly access the shadowed property." I read that as:

  Within get,   $this->Hours is the raw shadowed property.
  Within set,   $this->Hours is the raw shadowed property.
  Within isset, $this->Hours is the raw shadowed property.
  Within unset, $this->Hours is the raw shadowed property.

But you seem to imply:

  Within get,   $this->Hours is the raw shadowed property.
  Within set,   $this->Hours is the raw shadowed property.
  Within isset, $this->Hours is accessed via __getHours()/__setHours().
  Within unset, $this->Hours is accessed via __getHours()/__setHours().

So really the default implementations behave like this:

  isset { return $this->__getHours() !== NULL; }
  unset { $this->__setHours(NULL); }

I think the RFC should be much clearer about what property access actually means within each accessor method, as I expect users to be very surprised by this behavior.

This is also looks like it could lead to surprises:

  Within get, $this->Hours is the raw shadowed property.
  Within get, parent::$Hours is accessed via 
parent::__getHours()/parent::__setHours().

Also, is there no way to access the shadow property within isset/unset? If not, is there a good reason to not allow it?


Also, do/should multiple property accessors interact? Consider:

class Foo {
    public $a {
        get { $this->a = 1; return 2; }
    }
    public $b {
        get { return $this->a; }
    }
}

$foo = new Foo;
$foo->a; // 2 (but shadowed property is 1)
$foo->b; // 1 or 2?


Steve Clay
--
http://www.mrclay.org/

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

Reply via email to