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!
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php