Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:79251 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 51364 invoked from network); 27 Nov 2014 20:17:07 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 27 Nov 2014 20:17:07 -0000 Authentication-Results: pb1.pair.com smtp.mail=dev@mabe.berlin; spf=permerror; sender-id=unknown Authentication-Results: pb1.pair.com header.from=dev@mabe.berlin; sender-id=unknown Received-SPF: error (pb1.pair.com: domain mabe.berlin from 80.237.132.167 cause and error) X-PHP-List-Original-Sender: dev@mabe.berlin X-Host-Fingerprint: 80.237.132.167 wp160.webpack.hosteurope.de Received: from [80.237.132.167] ([80.237.132.167:55180] helo=wp160.webpack.hosteurope.de) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 6C/6A-27910-2C687745 for ; Thu, 27 Nov 2014 15:17:06 -0500 Received: from dslb-092-078-050-079.092.078.pools.vodafone-ip.de ([92.78.50.79] helo=[192.168.178.30]); authenticated by wp160.webpack.hosteurope.de running ExIM with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) id 1Xu5Ut-0003yl-9B; Thu, 27 Nov 2014 21:17:03 +0100 Message-ID: <547786BE.6020004@mabe.berlin> Date: Thu, 27 Nov 2014 21:17:02 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 MIME-Version: 1.0 To: Levi Morrison CC: internals References: <5474F3FA.8050108@mabe.berlin> <5477793A.1010307@mabe.berlin> In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-bounce-key: webpack.hosteurope.de;dev@mabe.berlin;1417119426;0f8677c8; Subject: Re: [PHP-DEV] Idea: immutable class / object From: dev@mabe.berlin (Marc Bennewitz) Am 27.11.2014 um 20:47 schrieb Levi Morrison: >> Am 25.11.2014 um 22:26 schrieb Marc Bennewitz: >> >>> Hi internals, >>> >>> In OOP it's a sometimes a common issue to know the state of an object and >>> to know if it was changed respectively it it can change state. >>> >>> We already have such objects like DateTImeImmutable and new proposed >>> objects like UString also introduce immutable objects. >>> >>> I think it would be really helpful to see this kind of issue addressed in >>> a standardized way: >>> >>> if you approve with this I would write down a more structured RFC. >>> >>> Now see the following code snipped: >>> >>> >> >>> immutable class MyImmutableClass { >>> public static $staticProperty = 'private static'; >>> public $ts; >>> public $obj; >>> >>> public function __construct($obj = null) { >>> $this->ts = time(); >>> $this->setObj($obj); >>> } >>> >>> public function getTimestamp() { return $this->ts; } >>> public function getObj() { return $this->obj; } >>> public function setObj($obj) { $this->obj = $obj; } >>> } >>> >>> // initialize >>> $obj = new DateTImeImmutable(); >>> $obj = new MyImmutableClass($obj); >>> >>> // check if immutable >>> var_dump(MyImmutableClass::immutable); >>> var_dump($obj::immutable); >>> >>> // read properties >>> var_dump($obj->ts, $obj->obj); >>> var_dump($obj->getTimestamp(), $obj->getObj()); >>> >>> // ERROR: Immutable objects can not contain mutable properties >>> $obj = new MyImmutableClass(new stdClass); >>> >>> // ERROR: Immutable objects can not be changed after initialization >>> $obj = new MyImmutableClass(); >>> $obj->setObj($obj); >>> $obj->obj = $obj; >>> >>> // ERROR: It's not allowed to change immutable variables >>> MyImmutableClass::$staticProperty = 'new value'; >>> >>> ?> >>> >>> Because of for immutable objects it's not allowed to set an mutable object >>> as property >>> you can be sure the object's state will be consistent. That's the main >>> difference from >>> marking all properties readonly or similar functionalities. >>> >>> Additionally it's simple to test if an class/object is immutable and >>> document it for free. >>> >>> Downside: New Keyword "immutable" > > What I think is more useful is C++'s const, which basically makes any > structure immutable when you need it. However, I don't think it's > worth going through the effort to bring this to PHP, as you would have > to add checks for preventing state changes in many places at runtime. > Are you sure there are so much places and runtime checks required for immutable classes? It's only needed to test on immutable objects and such objects doesn't do it as it's not possible to do. I think of flag ZEND_ACC_IMMUTABLE + simply switch the internal default function used to write properties to an object but I don't have enough knowledge about the engine. Marc