Re: readonly properties
| From: | Marc | 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:WOW this was fast. Less code and even a bugfix +1Hi, 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 {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.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
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?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); // 0The 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 propertiesYea you are probably right - it would be a heavy BC break for not much profit.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, NikitaThank you very much Nikita!