PHP bir değer türü yapı sınıfı taklit

4 Cevap php

PHP bir yapı sınıf taklit için herhangi bir yolu var mı? yani değerine göre değil, referans olarak geçer, bu yüzden hala bir türü olabilir bir sınıf ima etti ...

Ve eğer öyleyse, ne farklı teknikler kullanılabilir? En iyi teknik nedir?

Bu mümkün ise tabii ki PHP için tam bir türü güvenli tabakası oluşturabilir, bu katmanların var? Herkes bu ile herhangi bir deneyim oldu?

4 Cevap

Nesneler her zaman başvuruya göre iletilir. Bir kopya açıkça clone anahtar kelime (evet, her yerde) kullanmak için olduğu gibi onları geçmek için tek yol.

Benim tavsiye değer türleri vardır ve bu nedenle her zaman kopyalanan bir dizi kullanmak olacaktır. Eğer bir ilişkisel dizi (örneğin ip -> value) olarak kullanabilirsiniz bu yana, aynı zamanda bir nesne olabilir. Dezavantajı tabii ki, (bu mutlu olabilir bu yüzden ama bu yapı gibi) yöntemleri kullanamaz, olduğunu. Tür güvenliğini uygulamak için bir yöntem daha var.

PHP dilinin nazik değil gibi ama tüm gereksinimleri ile dürüst olmak, sesler.

Sizin değer sınıfları iletmenin olmak var, ve bütün "değişiklik" yöntemleri yerine yeni bir nesne geri dönelim - Ben kolay yolu yok java gibi yapmak olduğunu düşünüyorum.

Ben sadece PHP kodu ile, bu hedefe ulaşmak sanmıyorum.

Sen nasıl PHP fonksiyon kolu parametreleri üzerinde hiçbir kontrole sahip, ve ben her şeyin PHP ikili ve modülleri (alt düzey) kodunu değiştirmek zorunda kalmadan, istediğiniz şekilde işlenir hale nasıl görmüyorum.

Yine de, oldukça serin olurdu :)

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");