Hi,

2016-04-05 12:13 GMT+02:00 Marco Pivetta <ocram...@gmail.com>:

> Hi,
>
> On 5 April 2016 at 12:06, Michał Brzuchalski <mic...@brzuchalski.com>
> wrote:
>
>> Hi Marco,
>>
>> Ad. 1 it is posiible to redeclare in a sub-class final property as
>> non-final, here is some gist presenting my current impl working like:
>> https://gist.github.com/brzuchal/12ebda1efed59440a78ba43bff116728
>>
>
>
It works with public, private and protected properties.


> Does this work for public properties as well?
>
>
>> Ad. 2. `final` means class variable (like static) or class instance
>> property can not change their reference, it is impossible to replace zval
>> in such property, in my opinion `immutable` is object behavior when using
>> some methods you receive newly created (cloned) object which is changed
>> exactly like `DateTimeImmutable`
>> http://php.net/manual/en/datetimeimmutable.add.php
>>
>
> I am aware of what `final` means in other languages, it just seems that
> everyone then needs to translate back and forth from `final` to
> `immutable`. In addition to that, `final` has different meaning in
> inheritance (re-used keyword), so this adds to the confusion for people
> unfamiliar with the feature.
>
> Wiki about Final in Java
https://www.wikiwand.com/en/Final_(Java)#/Final_variables says:

# Final variables
A final variable can only be initialized once, either via an initializer or
an assignment statement. It does not need to be initialized at the point of
declaration: this is called a "blank final" variable. A blank final
instance variable of a class must be definitely assigned in every
constructor of the class in which it is declared; similarly, a blank final
static variable must be definitely assigned in a static initializer of the
class in which it is declared; otherwise, a compile-time error occurs in
both cases.[6] (Note: If the variable is a reference, this means that the
variable cannot be re-bound to reference another object. But the object
that it references is still mutable, if it was originally mutable.)

I took the name from Java and only implemented behavior like that, thats wy
I used `final`.


>> Ad. 3 it would be awesome if there could be final variables in general,
>> it would be quite stable if no one could change your variable, AFAIK zvals
>> have IMMUTABLE flag which could be used, don't know it for sure I'm rather
>> PHP dev than C there would be need some internals guru to ask if it's
>> posiible.
>>
>> P.S. We've meet on PHPCon'15 in Poland, thanks for +1.
>>
>
> YW!
>
>
>>
>> Cheers,
>> --
>> Michał Brzuchalski (aka brzuchal)
>>
>> 2016-04-05 11:13 GMT+02:00 Marco Pivetta <ocram...@gmail.com>:
>>
>>> Hi Michał,
>>>
>>> First of all: +1 to this: very useful for value objects!
>>>
>>> A few questions:
>>>
>>>  * can you re-declare a final property in a sub-class, making it
>>> therefore non-final? (I have reasons to do that, related with altering
>>> states via mappers)
>>>  * do we want to use `final`, or `immutable` for these properties?
>>> `final` seems to just be a confusing term here.
>>>  * is this feature portable to variables in general? I realize that
>>> adding metadata to ZVals has huge performance implications, but it would be
>>> interesting to do that for performance improvements further down the line
>>>
>>> Cheers,
>>>
>>>
>>> Marco Pivetta
>>>
>>> http://twitter.com/Ocramius
>>>
>>> http://ocramius.github.com/
>>>
>>> On 4 April 2016 at 19:53, Michał Brzuchalski <mic...@brzuchalski.com>
>>> wrote:
>>>
>>>> Hey Internals,
>>>>
>>>> I'm new here. I've been wondering / working on adding final properties
>>>> into
>>>> PHP lang.
>>>>
>>>> This work started once I had the time to read the "Core Java for
>>>> Impateient" by Cay S. Horstmann
>>>> and found it very usefull to have final properties like Java.
>>>>
>>>> Those properties differ than `const` because they can be set at runtime
>>>> -
>>>> but only once in their lifetime.
>>>> Such properties could be very usefull in Singletons, ValueObjects etc.
>>>> impl
>>>> like:
>>>>
>>>> class Money {
>>>>     public final $amount;
>>>>     public final $currency;
>>>>     public function __constructor($amount, $currency) {
>>>>         $this->amount = $amount;
>>>>         $this->currency = $currency;
>>>>     }
>>>> }
>>>>
>>>> In above example there is even no need for getter because those
>>>> properties
>>>> are immutable through
>>>> the final keyword, it means those properties cannot change their
>>>> references
>>>> just like in Java
>>>> https://en.wikipedia.org/wiki/Final_(Java)
>>>>
>>>> I've already started some impl on own fork
>>>>
>>>> https://github.com/php/php-src/compare/master...brzuchal:final-properties
>>>> I've got some basics in C programming, don't know yet if I can impl it
>>>> complex.
>>>>
>>>> I was wondering if it is usefull in yours opinion or is it only my
>>>> impression.
>>>>
>>>> I can provide an RFC if it sounds usefull and if I get Wiki karma
>>>>
>>>> Thanks
>>>> --
>>>> Michał Brzuchalski (aka brzuchal)
>>>>
>>>
>>>
>>
> As an additional question: how will this (eventually) play with typed
> properties? I am aware that you cannot declare a class named `final`, but
> that may change in future, so better factor it into any possible outcomes
> of the RFC.
>
> I don't know if it works with typed properties.
I can provide an RFC but need Wiki Karma (or smth like that) for my account
(login: brzuchal) and don't know how to receive it.


> Cheers,
>
> Marco Pivetta
>
> http://twitter.com/Ocramius
>
> http://ocramius.github.com/
>

Cheers,
--
Michał Brzuchalski (aka brzuchal)

Reply via email to