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:

<?php

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


--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to