Re: [RFC] isReadable/isWriteable property reflection

From: Date: Fri, 07 Nov 2025 19:12:02 +0000
Subject: Re: [RFC] isReadable/isWriteable property reflection
References: 1 2  Groups: php.internals 
Request: Send a blank email to internals+get-129136@lists.php.net to get a copy of this message
On Fri, Nov 7, 2025, at 5:03 AM, Tim Düsterhus wrote: > Hi > > Am 2025-11-06 00:24, schrieb Larry Garfield: >> 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 > > I dislike implicitly “scope-dependent” functions, since they effectively > act like magic. This probably makes it harder to understand for humans > and static analysis tools alike. I would therefore suggest making the > $scope parameter required. A user can just pass > static::class > themselves and static analysis tools can use class-string|null > instead > of class-string|"static"|null as their expected > parameter type. Given that the 90% or more case is likely to be "from my current context", making that the default seems the most ergonomic. (The counter argument, I suppose, is that this is hardly going to be a super-common routine to call so ergonomics don't matter.) stack-inspection isn't new. Closure::getCurrent() is the most recent example, so we don't think it's especially problematic. If there's a preference for avoiding magic strings, it would be easy enough to use an enum instead. Something like: enum CallerScope { case Caller; case Global; } function isReadable(string|CallerScope $scope = CallerScope::Caller, ?object $objecg = null) { ... } Caller would still do the same stack inspection, but it makes the type more tightly controlled and eliminates a nullable. > As for the magic method logic: I would suggest to ignore the presence of > __get() and __set(). This more closely aligns with the direction PHP > goes towards and is also easy to work around by checking with > method_exists() whether any such a method exists - the reverse > is not > true. thumbs-up.gif --Larry Garfield

« previous php.internals (#129136) next »