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

Reply via email to