PHP sınıfı özelliklerini depolamak için en iyi yolu nedir?

7 Cevap php

Duplicate of: http://stackoverflow.com/questions/546403/whats-the-best-way-to-store-class-variables-in-php

Bir süredir ben bir PHP sınıfı içinde özelliklerini saklamak nasıl bir meslektaş ile bu tartışma sahip oldum.

Yani hangisinin kullanılması gerektiği düşünüyorum. Böyle bir şey:

Class test{
    public $attr1;
    public $attr2;
    .............. 
    public function __construct(){
        $this->attr1 = val;  
        $this->attr1 = val;
        ...................   
    }
}

Karşı:

Class test{
    public $data;

    public function __construct(){
        $this->data['attr1'] = val;
        $this->data['attr2'] = val;
        ..........................       
    }
}

Eğer sık ​​sık içinde saklanabilir ve gereken birçok özelliklere sahip nesneler varsa, bu önemlidir.

Birçok özelliklere sahip nesneler ile uğraşırken de önemlidir, tüm almak için bütün ve tek bir yöntem belirlemek için oldukça bir yöntemi her nitelik için alıcı ve ayarlayıcıları kullanın veya musunuz?

7 Cevap

Sürüm 1 şeyler yapmanın daha "klasik" yoludur. Sizin nesne olduğunu söylemek tam olarak oldukça fazla.

Ben kesinlikle "daha iyi" olduğunu söyleyemem, ama ben daha uygun buluyorum, hangi söyleyebiliriz.

Ben dinamik sınıf sokmanıza izin için özel PHP5 alıcı ve ayarlayıcı yöntemleri ile birlikte ikinci sürümü (genellikle CodeIgniter'daki veritabanı modelleri için, özellikle erken gelişim sırasında) kullandım. yani

<?php
    class foo{
        private $data = array();

        function __construct()
        {
            # code...
        }

        public function __get($member) {
            if (isset($this->data[$member])) {
                return $this->data[$member];
            }
        }

        public function __set($member, $value) {
            // The ID of the dataset is read-only
            if ($member == "id") {
                return;
            }
            if (isset($this->data[$member])) {
                $this->data[$member] = $value;
            }
        }
    }

    $bar = new foo()
    $bar->propertyDoesntExist = "this is a test";
    echo $bar->propertyDoesntExist; //outputs "this is a test"
?>

Ben ikinci sürümü if and only if veri harici bir kaynaktan bir bütün olarak gelir (örn. BD sorgu) kullanmak istiyorum. Tabii bu durumda o olması tavsiye olacak jenerik __get() / __set() to access $this->data. Ayrıca IteratorAggregate interface dönen new ArrayIterator($this->data) uygulamayı düşünebilirsiniz.

i, daha doğru IDE otomatik tamamlamayı destekler ve daha kolay hata ayıklama yapar düşünüyorum çünkü şahsen ben, sürüm 1 kullanın.

bir değer ayar çok sık diğer değerler değişiklikleri tetikler, çünkü ben de, (i özel / çoğu zaman korumalı tanımlamak) benim üye değişkenler neredeyse tüm alıcı ve ayarlayıcıları kullanın. Hatta başka bir yerde değişiklikleri tetikleyebilir öznitelikler için alıcılar / ayarlayıcıları tanımlarsanız g & s yaratmanın bir dezavantajı, zamanla birikir çirkin, aptal kod büyük miktardır. ben hala tutarlı bir arayüz için bunu - i ek işlevsellik veya daha fazla değişiklik-on-set tanıtmak onarımları tanıtmak zaman hiç bilmiyorum.

Birinci yöntem hemen hemen standarttır. Bu açıkça özellikleri nelerdir tanımlar ve IDE ve kod dokümantasyon araçları mevcut nesne özellikleri almak için izin verir.

İkinci yöntem, ayrı bir kapsamda veri tutmak gerekir ki, korumalı ve özel seviye özellikleri için mükemmeldir. Ben çeşitli model sınıflarında, her iki yaklaşımın bir arada kullanmak, ya da yapılandırma seçeneklerini ve varsayılan izlemek için. Ben her zaman, ancak bu dizileri öncesi dolgu ve içindeki verilere sıkı bağlılığı sağlayacak.

Ben nesne özellikleri ve değişken kapsamı anlayış eksikliği gösterdiği gibi, hiç bir kamu malına için ikinci yöntem savunucusu olmaz, ve kod sorunları tanıtmak (birisi bir dize ile bu kök dizi yazar ne olur?)

Alıcılar ve belirleyiciler kullanımı çağıran kod değiştirilebilir olması gereken özellikleri yana yapar. Her özellik erişilebilir olmalı, bu yüzden nesneyi tanımlayan geliştirici kalmış. Alıcı / ayarlayıcı desen açıkçası, ortak özellikleri ile mantıklı değil, ama bazı doğrulama gerekebilir veya dezenfekte edilecek korumalı ve özel özellikleri ile yapar. Onlar da bağımlılık enjeksiyon bağlamında mantıklı.

Sürüm 1 kullanımı nedeni sürüm 2 nesnenin içinde yer almasıdır. Sizin nesne zaten değerlere varnames bir harita. Kendi arraymap ekleyerek yönlendirme bir gereksiz düzeyde ekliyoruz.

Iyi yöntem kesin bir standart olduğunu ancak ikinci bir emin daha rahat içindir ....

Bana ilk birini kullanın ve dinamik olarak çalışmak için sınıf içinde bu işlevi kullanın:

    public function GET__Attributes_in_Array(){
     $Prova = get_class_vars(get_class($this));
     print_r($Prova);

     return $Prova;
}

Bu fonksiyonu bütün nitelikleri ve bir sınıfın değeri ile bir dizi döndürür ...

Ben de, sürüm 1 tercih ederim. Dinamik üye (Chris sağlanan sürüm) ihtiyacınız yoksa, size üyelerini tanımlamak gerekir. Dinamik bir şekilde zor kodunuzu anlamak için yapar korkunç bir yapı çoğu durumda yol açar. Biri ^ ^ kodunuzu hata ayıklama ve kod bilmiyor gerekebilir ki, düşünün. Biz db tablodaki alanları ayna dinamik üyeleri kullanır daha büyük bir proje var. Onun tabloyu bilmeden kullanmak oldukça zor.

Aslında yanında, senin IDE dyn ile çalışmaz. üyeleri, bu üyeler VE PHPUnit bu nitelikler üzerinde Yansıma kullanamazsınız phpdoc kullanamazsınız. Thats sadece kötü kodlama tarzı.

Regards, Mario