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 PHP: rfc:property-hooks
(you'll have to scroll down a bit):
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:
$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