Le 04/06/2021 à 17:19, Nikita Popov a écrit :
Hi internals,
I'd like to open the discussion on readonly properties:
https://wiki.php.net/rfc/readonly_properties_v2
This proposal is similar to the
https://wiki.php.net/rfc/write_once_properties RFC that has been declined
previously. One significant difference is that the new RFC limits the scope
of initializing assignments. I think a key mistake of the previous RFC was
the confusing "write-once" framing, which is both technically correct and
quite irrelevant.
Please see the rationale section (
https://wiki.php.net/rfc/readonly_properties_v2#rationale) for how this
proposal relates to other RFCs and alternatives.
Regards,
Nikita
Hello,
If I understood it well you count assignments, one note thought after
re-reading once again, you state:
This variant is not allowed, as the initializing assignment occurs from outside the class:
Does this mean it'll prevent programmatic object hydration using the
scope-stealing closure pattern ? Such as:
<?php
class SomeClass
{
public readonly int $foo;
}
$bar = 12;
$object = (new \ReflectionClass('SomeClass'))->newInstanceWithoutConstructor();
(\Closure::bind(
function (SomeClass $object) ($bar
$object->foo = $bar;
},
null,
SomeClass::class
))($object);
?>
I know this is a weird stuff to do I wouldn't advise to others myself,
but some hydration libraries such as ocramius/generated-hydrator do
leverage this mechanism to hydrate objects, and I sometime do it myself
in business code, sporadically, to hydrate objects from database without
needing to define a constructor for those value objects.
If it does prevent such code, will there be some additional mechanism to
create value objects with readonly properties without constructor ? Such
as an JavaScript object-like object instanciation mechanism ?
<?php
class SomeClass
{
public readonly int $foo;
}
$bar = 12;
$object = {
foo: $bar,
};
?>
I know this goes far outside of this RFC's own scope, but maybe this is
the occasion to open a discussion about this, this would play well with
readonly properties and various serializers or hydrators libraries.
Regards,
--
Pierre