PHP: Sabit olarak bir sınıfa başvuru Set ...?

5 Cevap

Ben tanımlanmış sabitler bir dizi var ve bazıları için ben bir sınıfın yeni örneklerini seri hale kulüpler ve (, biliyorum ... muhtemelen iyi bir fikir) sürekli olarak ayarlayarak, sorun olduğu zaman örneğinin bilgi değişiklikler sınıf, o sürekli olarak ilan edildi başvurulan bellek güncelleme yok ... Ben sürekli değişmiş olamaz biliyorum, ama gerçekten sadece bir bellek bloğu işaret ve bellek bilgileri değiştiğinde, bu yüzden değil gerektiği sabitinin dönen değeri? Ben ne dedim kimseyi karıştırmayın önce Eh, ben sadece ne yaptım size göstereceğim:

<?php
    class Collection {
        var $items = array();

        public function __construct() { }

        public function add($val) {
            array_push($this->items, $val);
        }

        public function dump() {
            var_dump($this->items);
        }
    }

    $collection = new Collection();
    define('COLLECTION', serialize(&$collection));
    unserialize(COLLECTION)->add('test item 1');
    unserialize(COLLECTION)->add('test item 2');
    unserialize(COLLECTION)->dump();
    /* It will end up dumping this:
       array(0) { }
     */
?>

Ben birçok işlevleri içinde, ben bu sadece değişkeni kullanarak ve {[(0 kullanarak basit yapılabilir biliyorum, pek çok (30 +), farklı php dosyalarına bu sabitleri kullanarak olacak çünkü Şimdi ben yapıyorum nedenidir )]} her işlev, ama ben en sunucuları globallerinin kapalı beri bunu önlemek için çalışıyorum. Bunu lutfen yaklaşım için daha iyi bir yolu olup olmadığını söyle lütfen. />

Nadeem

5 Cevap

Daha iyi bir seçenek Singleton deseni veya serileştirme önlemek için böyle bir şey, uygulamak olacaktır:

class Collection {
    var $items = array();

    public function __construct() { }

    public function add($val) {
        array_push($this->items, $val);
    }

    public function dump() {
        var_dump($this->items);
    }

    public function push($v) {
        $this->items[]= $v;
    }

    static protected $_instance = null;
    static public function get() {
       if (empty(self::$_instance)) self::$_instance= new Collection();
       return self::$_instance;
    }

}

Collection::get()->push('test item 1');
Collection::get()->push('test item 2');
Collection::get()->dump();

Neden sadece bir işlev tanımlamak değil?

function push_item($item) {
  global $collection;
  $collection->push($item);
}

Bu çok tefrika sınıfın bir sabiti tanımlayan daha temiz (yani neredeyse WTF toprakları, üzgünüm) bulunuyor.

Sizin sabit bir dize depoluyor. Bunu unserialise zaman sabitinin değeri olursa olsun size (ipucu ... gerçekten adı var) ondan oluşturulan sınıfa ne değişmez. Sorunuzun üzerinde yorumda Brad'in öğütler ve bir kayıt defteri kullanın.

... En sunucularında beri globallerinin kapatmış.

Orada karışıklık birkaç nokta bu soru vardır, ve bu da bunlardan biridir. Sunucuların çoğu seçeneği var register_globals kapalı. Bu sizin uygulamada küresel değişkenleri kullanarak sizi engellemez. Seçenek yapar Bütün bu $_GET değerleri ithal ve $_POST olduğunu (ve daha az) senaryonuzun başından itibaren global değişkenler olarak.

** ÇÖZÜLDÜ **

Toplanan tanımların statik bir dizi içeren basit bir karma listesi oluşturarak sorunu çözüldü. Tüm cevaplar için teşekkürler, önerileriniz bana birlikte bu koymak yardımcı oldu:

class MixedList {
    protected static $list = array();

    public static function set($key, $val) {
        self::$list[$key] = &$val;
        if (!defined($key)) eval("define('{$key}', '{$key}');");
    }

    public static function &get($key) {
        return self::$list[$key];
    }
}

// Usage:
MixedList::set('COLLECTION', new Collection());
MixedList::get(COLLECTION)->add('test item 1');
MixedList::get(COLLECTION)->add('test item 2');
MixedList::get(COLLECTION)->dump();
// You could also do wrap the arguments as a string, would do the same trick

- Thanks!
  Nadeem