Re: RFC - Immutable classes
| From: | Fred Emmott | Date: | Fri, 09 Sep 2016 19:46:28 +0000 |
| Subject: | Re: RFC - Immutable classes | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-95874@lists.php.net to get a copy of this message | ||
I see Reflection is still todo; should there be a similar escape hatch to
ReflectionMethod::setAccessible()?
This would allow things like: https://gist.github.com/fredemmott/01ad55c0c03c8d7ba62bbd6e9fb23686
<https://gist.github.com/fredemmott/01ad55c0c03c8d7ba62bbd6e9fb23686>
(apologies for the hack-like syntax) - the ‘every property must be a constructor parameter’
approach in the RFC seems like it would rapidly become unwieldy for classes with a large number of
properties.
Regards,
- Fred
On Aug 8, 2016, at 3:31 AM, Silvio Marijić <marijic.silvio@gmail.com> wrote:
>
> Hi,
>
> I would need your help with one idea. I'm working on one RFC that I'm would
> like to submit. Idea is that after you initialize object eg. after
> constructor returns, object would be locked, and you wouldn't be able to
> change properties on that object anymore. It would like this:
>
> <?php
>
> immutable class Email {
>> public $email;
>> public function __construct($email){
>> $this->email = $email;
>> }
>> }
>> $email = new Email("example@email.com");
>
>
>
> After instance of class is created, object is "frozen" so call like this
>
> $email->email = "new@email.com";
>
>
> Would result in error.
>
> I have already implementation up to certain degree, but I need one advice
> from more experienced developers. Where is the place where I could put
> logic to lock object after the constructor has finished? Maybe in zend vm
> on ZEND_NEW token?
>
> Some constraints are needed:
>
> 1. Child class that extends immutable class must be defined as immutable
> also.
> 2. If property on immutable class contains object, it must be instance
> of immutable class.
> 3. You can not have immutability per property, it either whole class or
> none.
>
> Thank you all in advance.
>
> --
> Silvio Marijić
> Software Engineer
> 2e Systems