I anonymous's suggestion nesnenin herhangi bir mutasyon yeni bir nesne döndürmek yapmak ve bu işleri için uğraşırken, ama o garip.
<?php
class FruityEnum {
    private $valid = array("apple", "banana", "cantaloupe");
    private $value;
    function __construct($val) {
        if (in_array($val, $this->valid)) {
            $this->value = $val;
        } else {
            throw new Exception("Invalid value");
        }
    }
    function __set($var, $val) {
        throw new Exception("Use set()!!");
    }
    function set(FruityEnum &$obj, $val) {
        $obj = new FruityEnum($val);
    }
    function __get($var) { //everything returns the value...
        return $this->value;
    }
    function __toString() {
        return $this->value;
    }
}
Ve şimdi bunu test etmek için:
function mutate(FruityEnum $obj) { // type hinting!
    $obj->set($obj, 'banana');
    return $obj;
}
$x = new FruityEnum('apple');
echo $x; // "apple"
$y = mutate($x);
echo  $x // still "apple"
    . $y // "banana"
Bu çalışır, ancak nesneyi değiştirmek için garip bir yol kullanmak zorunda:
$obj->set($obj, 'foo');
Bunu yapmak için düşünebildiğim tek diğer yolu __set() yöntemini kullanmak olacaktır, ama bu daha da kötü oldu. Sen kafa karıştırıcı kanlı olan, bunu yapmak zorunda.
$obj = $obj->blah = 'foo';
Sonunda, bu değişkenleri özel yapmak ve hiçbir mutators sağlamak için muhtemelen daha kolay, yani bir değişkenin "enum" değerini değiştirmek için tek yol yeni bir tane oluşturmak olacaktır:
echo $obj; // "banana"
$obj = new FruityEnum("cantaloupe");