Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:92095 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 43953 invoked from network); 5 Apr 2016 10:57:57 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 5 Apr 2016 10:57:57 -0000 Authentication-Results: pb1.pair.com smtp.mail=michal@brzuchalski.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=michal@brzuchalski.com; sender-id=pass Received-SPF: pass (pb1.pair.com: domain brzuchalski.com designates 188.165.245.118 as permitted sender) X-PHP-List-Original-Sender: michal@brzuchalski.com X-Host-Fingerprint: 188.165.245.118 ns220893.ip-188-165-245.eu Received: from [188.165.245.118] ([188.165.245.118:37104] helo=poczta.brzuchalski.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 72/03-27948-13A93075 for ; Tue, 05 Apr 2016 06:57:55 -0400 Received: from localhost (localhost.localdomain [127.0.0.1]) by poczta.brzuchalski.com (Postfix) with ESMTP id 7043B2984211 for ; Tue, 5 Apr 2016 12:57:50 +0200 (CEST) Received: from poczta.brzuchalski.com ([127.0.0.1]) by localhost (poczta.brzuchalski.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 9zj0SgZzuZB6 for ; Tue, 5 Apr 2016 12:57:47 +0200 (CEST) Received: from mail-lf0-f49.google.com (unknown [209.85.215.49]) by poczta.brzuchalski.com (Postfix) with ESMTPSA id 818D729841C4 for ; Tue, 5 Apr 2016 12:57:47 +0200 (CEST) Received: by mail-lf0-f49.google.com with SMTP id j11so7432008lfb.1 for ; Tue, 05 Apr 2016 03:57:47 -0700 (PDT) X-Gm-Message-State: AD7BkJJUQ6BHACkr9IIjSDQwtPSUDjwtKQ2j7/j5aHaECr2jWhDaaXpwgl7MgFdI6i4MQ5mFyq3IbnGuG122Bw== MIME-Version: 1.0 X-Received: by 10.25.142.130 with SMTP id q124mr4938868lfd.128.1459853867108; Tue, 05 Apr 2016 03:57:47 -0700 (PDT) Received: by 10.25.24.40 with HTTP; Tue, 5 Apr 2016 03:57:47 -0700 (PDT) In-Reply-To: References: Date: Tue, 5 Apr 2016 12:57:47 +0200 X-Gmail-Original-Message-ID: Message-ID: To: Marco Pivetta Cc: PHP Internals List Content-Type: multipart/alternative; boundary=001a114024242c75f3052fbab7f7 Subject: Re: [PHP-DEV] Final properties From: michal@brzuchalski.com (=?UTF-8?Q?Micha=C5=82_Brzuchalski?=) --001a114024242c75f3052fbab7f7 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi, 2016-04-05 12:13 GMT+02:00 Marco Pivetta : > Hi, > > On 5 April 2016 at 12:06, Micha=C5=82 Brzuchalski > 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 zva= l >> in such property, in my opinion `immutable` is object behavior when usin= g >> 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 zva= ls >> have IMMUTABLE flag which could be used, don't know it for sure I'm rath= er >> 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=C5=82 Brzuchalski (aka brzuchal) >> >> 2016-04-05 11:13 GMT+02:00 Marco Pivetta : >> >>> Hi Micha=C5=82, >>> >>> 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 woul= d be >>> interesting to do that for performance improvements further down the li= ne >>> >>> Cheers, >>> >>> >>> Marco Pivetta >>> >>> http://twitter.com/Ocramius >>> >>> http://ocramius.github.com/ >>> >>> On 4 April 2016 at 19:53, Micha=C5=82 Brzuchalski >>> 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 runtim= e >>>> - >>>> 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 =3D $amount; >>>> $this->currency =3D $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-propert= ies >>>> 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=C5=82 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=C5=82 Brzuchalski (aka brzuchal) --001a114024242c75f3052fbab7f7--