Re: readonly properties

From: Date: Fri, 13 Aug 2021 15:53:36 +0000
Subject: Re: readonly properties
References: 1 2  Groups: php.internals 
Request: Send a blank email to internals+get-115708@lists.php.net to get a copy of this message
On 8/13/21 4:56 PM, Nikita Popov wrote:
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.
WOW this was fast. Less code and even a bugfix +1
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.
I was referring to the property "days" only as this is a non writable value generated on "DateTime->diff". As you can see in the snipped it doesn't allow to modify days but it also doesn't fail which seems wrong to me. I don't have much knowledge about internals but would it be possible to define "public readonly int|false $days" not using getters/setters and keep all other properties as it?
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.
Yea you are probably right - it would be a heavy BC break for not much profit.
Regards, Nikita
Thank you very much Nikita!

« previous php.internals (#115708) next »