Le jeu. 4 déc. 2025 à 18:03, Larry Garfield <[email protected]> a écrit :
> On Thu, Dec 4, 2025, at 10:47 AM, Nicolas Grekas wrote: > > Le jeu. 4 déc. 2025 à 17:39, Larry Garfield <[email protected]> a > écrit : > >> On Thu, Dec 4, 2025, at 8:05 AM, Nicolas Grekas wrote: > >> > Le jeu. 6 nov. 2025 à 00:28, Larry Garfield <[email protected]> > a écrit : > >> >> In other news, Ilija and I said a year ago that we'd take a swing at > adding isReadable/isWriteable methods to ReflectionProperty. Took a while, > but here we are. A strangely small RFC from us: > >> >> > >> >> https://wiki.php.net/rfc/isreadable-iswriteable > >> >> > >> > > >> > > >> > Thanks for this. > >> > I also think the auto-scope is [NOT] a good idea. You state that 90% > of use > >> > cases will need this but my experience doesn't back this claim. The > >> > only cases where I had to check for read/writeable were out of the > >> > local scope, so I'd say 100% of my experience goes against that 90% > >> > number ;) Joke aside, it'd be just fine to let ppl be explicit. > That's > >> > better than "oops I forgot to give the correct scope" bugs. > >> > > >> > About magic methods, one unsets a property only to have __get/__set > >> > called. Existing code works with this assumption. This means we have > to > >> > return true IMHO. Magic methods are just generic hooks also. Which > >> > means they should behave the same. > >> > > >> > Nicolas > >> > >> Well, the only people who seem to have an opinion don't like "static", > so we've removed it. RFC updated. > >> > >> As for __get/__set, that's so far one vote for ignore (Tim), and one > for always-true (Nicolas). Not a consensus. :-) > >> > >> Nicolas, can you clarify with an example if/how ignore would break > things? > >> > >> I think once we settle that question and the cooldown passes we're > ready for a vote, though at this point that means January. > >> > > > > I can try to build a synthetic example but the gist is: > > A class that starts with only properties and no __get() should be able > > to move to a __get()-based hooking in a later version without breaking > > code that uses isReadable(). > > That on its own should be enough to settle the desired behavior :) > > So you want to be able to transition from: > > class Foo > { > public private(set) string $name; > } > > To > > class Foo > { > private array $vals = []; > > public function __get(string $name) > { > return $this->vals[$name] ?? throw new Exception(); > } > } > > Is that right? Because both approaches would result in changes in some > situations there. > > If __get is ignored and the value is set, then a global isReadable check > will go from true to false in that transition. > > If __get always returns true and the value is still uninitialized, a > global isReadable check will go from false to true in that transition. > > Either way, that's not a fully safe transition to make. > > --Larry Garfield > Nah, I'm thinking about a scenario very close to what you talk about in the RFC: unset + __get From: class Foo { public int $abc; public function __construct() { $this->abc = stuff(); } } To: class Foo { public int $abc; public function __construct() { unset($this->abc); } public function __get($name) { if ('abc' === $name) { return $this->abc = stuff(); } } }
