Almost forgot: these examples apply also to private and protected properties. That's currently the only way to make the behavior consistent across friend objects (same scope).
On Mon, Jan 16, 2017 at 12:27 AM, Marco Pivetta <ocram...@gmail.com> wrote: > Hi Wes, > > This has been discussed before, and it's currently used to intercept > access to properties. Since we don't have property accessors (sigh), the > code (simplified version) would look like following: > > class Foo > { > public $bar = 'baz'; > } > > class FooInterceptor extends Foo > { > private $wrapped; > public function __construct(Foo $wrapped) > { > $this->wrapped = $wrapped; > unset($this->bar); > } > public function __get(string $name) > { > var_dump('reading ' . $name); > return $this->wrapped->$name; > } > } > > $foo = new FooInterceptor(new Foo); > > var_dump($foo->bar); > > You can see a working example at https://3v4l.org/UtugD > > This behavior is protected from regressions since PHP 5.4, but has been > working since 5.0: https://github.com/php/php-src/blob/ > cd2b462a2742c79256668d4736644e34573c33d9/tests/classes/ > unset_properties.phpt > > We can most probably get rid of this weird behavior once property > accessors are in the language. > > Greets, > > Marco Pivetta > > http://twitter.com/Ocramius > > http://ocramius.github.com/ > > On Mon, Jan 16, 2017 at 12:20 AM, Wes <netmo....@gmail.com> wrote: > >> Hello elephpants. >> >> Currently PHP allows explicitly declared fields (eg public $foo = 10;) to >> be removed entirely through unset (eg unset($obj->foo)). >> >> Now that isn't really an issue as properties in php are currently untyped >> and therefore nullable; at worst you would get a notice. But it would >> become an issue with typed fields... that might get a second chance sooner >> or later. >> >> But regardless of that, it looks very strange to me that this is allowed >> for fields that are explicitly declared. I think unset() should set the >> field to null if it's declared in the class, and remove the field >> altogether only if it was defined dynamically. >> >> On the other hand, this is just one of many ways of hacking php that just >> exist and we accept / don't care because we have faith in other people not >> doing nasty stuff with our code. This might sound ironic it is actually >> not >> :P >> >> However, I am curious: what you think about this? Should PHP do something >> in regard? Should this continue to work like it does now? Why do you feel >> it should do the one or the other? >> > > Marco Pivetta http://twitter.com/Ocramius http://ocramius.github.com/