Hi everyone While reviewing the property hooks patch, Bob found a discrepancy in the implementation and the specification. There is an unfortunate mistake in one of the examples that suggests specific by-reference behavior that we did not intend to support.
Specifically, from https://wiki.php.net/rfc/property-hooks#references (you'll have to scroll down a bit): ```php class C { public string $a { &get { $b = $this->a; return $b; } } } $c = new C(); $c->a = 'beep'; // $c is unchanged. ``` This example implies that the assignment `$c->a = 'beep';` will invoke `&get` to write to the contents of the reference. However, this is not the case. Direct assignments will, in the absence of `set`, fall back to the builtin write operation for backed properties, or throw for virtual properties. Instead of `$c->a = 'beep';`, the example _should_ have said: ```php $ref = &$c->a; $ref = 'beep'; ``` Here, `$ref = &$c->a;` _will_ call `&get`. What the example intended to show is that the reference returned by `&get` is detached from `$c->a` itself. That said, I did give this idea some thought. I think it would not have been unreasonable to automatically call `&get` and assign to the returned reference when there is a `&get` hook but _no_ `set` hook. However, when trying to implement this, I encountered some technical issues that make this currently unfeasible. So, we'd like to move forward with the original semantics: If there is no `set` hook, then the assignment will trigger a builtin write for backed properties, or an error for virtual properties. If you wish to achieve the behavior described above (using `&get` to write to the property), you can implement `set` to perform the write to the reference yourself. I hope that these semantics are acceptable for everyone. Ilija