Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:92093 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 39156 invoked from network); 5 Apr 2016 10:06:32 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 5 Apr 2016 10:06:32 -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:55175] helo=poczta.brzuchalski.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id EB/22-27948-32E83075 for ; Tue, 05 Apr 2016 06:06:29 -0400 Received: from localhost (localhost.localdomain [127.0.0.1]) by poczta.brzuchalski.com (Postfix) with ESMTP id 78B1929841C4 for ; Tue, 5 Apr 2016 12:06:24 +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 iBdjm1Ovnz2c for ; Tue, 5 Apr 2016 12:06:18 +0200 (CEST) Received: from mail-lb0-f177.google.com (unknown [209.85.217.177]) by poczta.brzuchalski.com (Postfix) with ESMTPSA id B5735298420D for ; Tue, 5 Apr 2016 12:06:18 +0200 (CEST) Received: by mail-lb0-f177.google.com with SMTP id bc4so5986117lbc.2 for ; Tue, 05 Apr 2016 03:06:18 -0700 (PDT) X-Gm-Message-State: AD7BkJIqBKcsv6MZTdcFGjxDPVXpXwpjemJMd5r9uq+LyOjOKkn+QQaLJgeNMiekp9jaC0khC8BmfqYTOw4w9w== MIME-Version: 1.0 X-Received: by 10.112.155.5 with SMTP id vs5mr6024168lbb.33.1459850778218; Tue, 05 Apr 2016 03:06:18 -0700 (PDT) Received: by 10.25.24.40 with HTTP; Tue, 5 Apr 2016 03:06:18 -0700 (PDT) In-Reply-To: References: Date: Tue, 5 Apr 2016 12:06:18 +0200 X-Gmail-Original-Message-ID: Message-ID: To: Marco Pivetta Cc: PHP Internals List Content-Type: multipart/alternative; boundary=089e01160d820f9913052fb9ff86 Subject: Re: [PHP-DEV] Final properties From: michal@brzuchalski.com (=?UTF-8?Q?Micha=C5=82_Brzuchalski?=) --089e01160d820f9913052fb9ff86 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable 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 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 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. 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 therefor= e > 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 addin= g > 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=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 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 =3D $amount; >> $this->currency =3D $currency; >> } >> } >> >> In above example there is even no need for getter because those properti= es >> 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-propertie= s >> 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) >> > > --089e01160d820f9913052fb9ff86--