On Thu, Aug 12, 2021 at 9:16 PM Marc <marc@mabe.berlin> wrote: > Hi, > > As 8.1 adds readonly properties I wonder which build-in properties > should be defined readonly. > > Currently I could find build-in readonly properties only on PDO and DOM. > > > Very incomplete list where readonly properties could make sense: > > 1. Enum properties: > > enum Test:string { > case TEST = 'test'; > } > > $case = TEST::TEST; > $refl = (new ReflectionObject($case))->getProperty('value'); > var_dump($refl->isReadOnly()); // false > var_dump($refl->isPublic()); // true > $case->value = 'foo'; // Fatal error: Uncaught Error: Enum properties > are immutable >
Yeah, these are a perfect use case for "readonly". Done in https://github.com/php/php-src/commit/caefc6a50789295b0993c4e657c825484650172a. This actually fixes a bug, because the homegrown "readonly" implementation for enums was not quite correct. > 2. DateInterval->days > > $interval = (new DateTime())->diff(new DateTime()); > var_dump($interval->days); // 0 > $refl = (new ReflectionObject($interval))->getProperty('days'); > var_dump($refl->isReadOnly()); // false > var_dump($refl->isPublic()); // true > $interval->days = 2; > var_dump($interval->days); // 0 > The DateInterval properties are currently implemented as getters/setters on some internal state. Some of those are getter-only, but probably not fully immutable. 3. Exception properties > > Exception properties are protected but does it really make sense to be > able to modify an exception property after initialization? > > I know this would be a BC break :( > There is definitely code out there relying on modifying both protected and private Exception properties, I don't think we want to touch these without cause. Regards, Nikita