Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:95555 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 71864 invoked from network); 2 Sep 2016 09:22:54 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 2 Sep 2016 09:22:54 -0000 Authentication-Results: pb1.pair.com smtp.mail=marijic.silvio@gmail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=marijic.silvio@gmail.com; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.214.51 as permitted sender) X-PHP-List-Original-Sender: marijic.silvio@gmail.com X-Host-Fingerprint: 209.85.214.51 mail-it0-f51.google.com Received: from [209.85.214.51] ([209.85.214.51:37319] helo=mail-it0-f51.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id D1/62-19490-CE449C75 for ; Fri, 02 Sep 2016 05:22:53 -0400 Received: by mail-it0-f51.google.com with SMTP id e124so27357195ith.0 for ; Fri, 02 Sep 2016 02:22:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=Bk00kiCf5kB6YGYbELwLU4+IqLrpkTd8eLjEXDQDJyk=; b=w6Jk4Qp6i98kWCfz4Ph1QC02VzF4VB4ZcbbQFSpHaOSThn1UhT5qSsQL4FGwO4r+2x 13bpPctYZMiIzWtK2MwcbZfSYLWXLbr7VQK/Z738NADZF04VIIi1bFyTK7WXJ+sjF1Tn Qql9BpMWt0W+3AdkfAiyH7Nfm+GoQ85f6unfI8AtjN6Xy78JDgjBwV7iMWF6vta/FLSp 39U51RlFnKPW9dGXJy3LO4mulUo81SWsp7U8/wk4PQFAtRAqDdsOaEIGIuvVqs3e7sKq H2YhvNU2LSvBNGuxsc9PB/eHTVfSHd9WH2g0x0kLBV4NielqjNpsP74QAo2Ju0scqTAb RtRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=Bk00kiCf5kB6YGYbELwLU4+IqLrpkTd8eLjEXDQDJyk=; b=jHnv3k3mkv3Fmqz1gYZc9RixC4Ml8S1xjf4jx1owdkWKYG/T7uMuoyFG+f/RdvtaNb /bFjXSRvjHJgf6+uF7arZs0eVptGs+B4dhyWbH8x+J75bRmSau1luMnkF6+/3bLGSJdZ eRdJ409uuzwM7gwAxXjM+xjy20soyn86YUy0AtguvTHm88C3NNW2avHb8V/keDJo6Wxs QUp4tgXxmxTsOyYpB9twonzQRNJrX2YGo1DQzEWaDVLTlrRmkUTdoa/LkXqemAwoWFjI vSqBDASwNQwJWuR1HexU5baydrpaQY+D6d4PjrRfv0MAY21rovAmgDp/HH87KNivhE5x MHtw== X-Gm-Message-State: AE9vXwPhAJON7Bi+LHmoc3GBHTlLN97CYZ9rzUuf+J4ldN7BXsNMRWNrm+s3hrze2ZjTyczX4SUuA/pLYgejVg== X-Received: by 10.36.95.1 with SMTP id r1mr3659267itb.6.1472808169724; Fri, 02 Sep 2016 02:22:49 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.237.74 with HTTP; Fri, 2 Sep 2016 02:22:49 -0700 (PDT) In-Reply-To: <7b45006f-7b02-3863-9bb3-bc911863c8ab@texthtml.net> References: <167d6432-e4d6-d87d-5d31-d3d82a8de4ce@fleshgrinder.com> <99F80C06-654D-4109-BE07-2FA5B1073E5D@ez.no> <4f54308a-4a69-2e6b-2ed0-51d4336d1cd4@fleshgrinder.com> <5969d1af-48e5-1376-07fe-9568de538145@texthtml.net> <7b45006f-7b02-3863-9bb3-bc911863c8ab@texthtml.net> Date: Fri, 2 Sep 2016 11:22:49 +0200 Message-ID: To: Mathieu Rochette Cc: =?UTF-8?Q?Micha=C5=82_Brzuchalski?= , PHP Internals List , Fleshgrinder Content-Type: multipart/alternative; boundary=001a1144981ec7610f053b82df63 Subject: Re: [PHP-DEV] RFC - Immutable classes From: marijic.silvio@gmail.com (=?UTF-8?Q?Silvio_Mariji=C4=87?=) --001a1144981ec7610f053b82df63 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable From point of immutability of object, there is no difference if property is defined or not, so you are correct, last line in your code will throw an error. 2016-09-02 11:06 GMT+02:00 Mathieu Rochette : > thank you for the clarification, more questions inline :) > > > On 09/02/2016 04:23 AM, Micha=C5=82 Brzuchalski wrote: > > Firstly, thanks for your interest. > > My answers are inline. > > > > 2016-09-01 23:48 GMT+02:00 Mathieu Rochette : > > > >> > >> On 09/01/2016 09:12 PM, Fleshgrinder wrote: > >>> On 9/1/2016 3:49 PM, Silvio Mariji=C4=87 wrote: > >>>> Hi Andre, > >>>> > >>>> Here is RFC https://wiki.php.net/rfc/immutability and you have link > to > >>>> implementation github. Any suggestions and feedback are more then > >> welcome. > >>>> Best, > >>>> Silvio > >>>> > >>> Hi Silvio, > >>> > >>> very nice work you guys did here! :) > >> indeed! nice to see this going forward > >>> Abstract classes are not mentioned at all in the RFC. However, there = is > >>> a test case from which it is clear that abstract classes cannot be > >>> immutable. Are there any reasons for this restrictions? > >>> > >>> What about array and resource values? Not mentioned in the RFC. > >> I guess they are not authorized in immutable classes as they are not > >> immutable themselves, but I think it could be explained > >> > > Yes that could be explained, they are actually not authorized because w= e > > cannot guarantee developer will use them internally only. So in case th= is > > property will interact with immutable object state should be also > immutable. > > > > > >>> The fact that cloning is not possible should also be extended in the > >>> RFC. I mean, it's clear to me but maybe not to others. Remember that > the > >>> RFC is the main source of information for the feature (e.g. to genera= te > >>> documentation). > >> agreed, I don't get why it's not possible :/ > > I think any RFC enchancements in this area is welcome. > > > > > >>> Why the restrictions that all properties of an immutable class that > take > >>> objects must be immutable too? It's clear why an immutable property > must > >>> contain an immutable class but the inheritance from the class to the > >>> properties is not consistent with how things work. An immutable class > >>> might want to contain an internal cache (e.g. flyweight pattern). > >>> > >>> immutable final class Flyweight { > >>> > >>> private static $instances =3D []; > >>> > >>> public immutable $value; > >>> > >>> private function __construct($value) { > >>> $this->value =3D $value; > >>> } > >>> > >>> public static function ENUM_ORD() { > >>> if (isset(self::$instances[1]) =3D=3D=3D false) { > >>> self::$instances[1] =3D new self(1); > >>> } > >>> > >>> return self::$instances[1]; > >>> } > >>> > >>> } > >>> > >>> $o1 =3D Flyweight::ENUM_ORD(); > >>> $o2 =3D Flyweight::ENUM_ORD(); > >>> > >>> var_dump($o1 =3D=3D=3D $o2); // bool(true) > >> I can understand the usecase, but then, how could the language ensure > >> the class is immutable > > > > It cannot be ensured while non-immutable property will exists in > immutable > > object. > > > > > >> side note: what about access (read & write) to undefined properties ? > >> > > You mean properties which are declared and default null and never chang= ed > > during object instantiation? > I meant properties which are not declared at all, eg: > > class foo { > } > $f =3D new foo(); > var_dump($f->bar); > $f->bar =3D 'taz'; > > I expect it to print null and throw an error on write access, but it's > just to be sure. actually I guest it should be the same than with > declared with default null and never changed during object instantiation > > > > > > >>> Note that we could add the restriction that an immutable class that > >>> should be used in a threading context must contain only immutable > >>> properties in the future when the need arises. However, for now I do > not > >>> see the need to inherit the modifier from the class to its properties > >>> and I see use cases where the developer wants more control. > > We agreed that it would be best for ensuring the object state is > immutable > > (that implies it can be deeply frozen for writes as deep as all his > > properties > > and properties object properties etc.) > > > > > >>> The test cases cover the most stuff but not everything and could be > >>> extended. There are other things with the PR but I will check it out > and > >>> create a PR against your branch with that so you can review it. (Migh= t > >>> take a while so bare with me.) > >>> > >> The RFC contains several grammatical issues. I could help you with tha= t > >>> too if you want. > >>> > > As abowe any RFC enchancements are welcome :) > > > > > >>> There is a lot of diff noise in the ext/tokenizer/tokenizer_data.c > file. > >>> > >> -- > >> Mathieu Rochette > >> > >> > >> -- > >> PHP Internals - PHP Runtime Development Mailing List > >> To unsubscribe, visit: http://www.php.net/unsub.php > >> > >> > > > > -- > Mathieu Rochette > > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > > --=20 Silvio Mariji=C4=87 Software Engineer 2e Systems --001a1144981ec7610f053b82df63--