__ Get () ve __ set için En İyi Uygulamalar () [kapalı]

4 Cevap php

question özel değişkenleri erişmek için __get() ve __set() kullanarak bu kaynaklanan, onlar genel olarak nasıl kullanıldığına giriş almak istiyorum. Ne zaman ya da nerede bir aşırı yüklenmelerin işlevi kullanmak için en iyi zaman olacağını merak ediyorum, ve (eğer varsa) bir yeri kullandık.

Sadece temiz olması için, biz bu işlevleri bahsediyoruz: http://us2.php.net/manual/en/language.oop5.magic.php

4 Cevap

Lazy Models Getters (using __get())

Benim apps çok sık PHP'nin sihirli yöntemler kullanılarak hatırlamıyorum, ama ben __get(), çok yararlı oldu bir durum hatırlıyorum.

Geri Ben modeller çok ve belirli kontrol ünitesinde kullanılan tüm modelleri vardı CakePHP çerçevesinde bir uygulama geliştirme edildi günlerde yöntem sadece (o Kek çalışıyordu nasıl) bir veya ikisinin faydalanmak bile başlatılmıştır. (Onlar ilk kez kullanıldığında yükleme modellerde) Yani tembel tembel modelleri olduğunu değiştirmeye karar verdi.

Ben yaptım ben bütün özel adı olan bir model için baktım ve yüklenen çok basit bir __get() fonksiyonu eklenir. Bu kod 3-4 çizgileri gibiydi. Ben (her CakePHP sınıflar bu kontrolör türemiştir) AppController bu tanımlanan ve aniden benim app hız kazanmış ve daha düşük bellek kullandı.

Ben daha sonra daha aldı ve aynı zamanda aynı şekilde tembel bileşenleri yükleme yaptı.

Dynamic Model Methods (using __call())

Başka bir örnek, aynı zamanda CakePHP gelen modellerde nasıl Kek arama olduğunu. Temelde bunun için iki yöntem var: find() ve findAll() her model, ama aynı zamanda findBy<FieldName>() ve findAllBy<FieldName>() yöntemlerini kullanarak arama yapabilirsiniz.

Örnekte tablo db varsa

notes(id, date, title, body)

Ve bunun için Pasta modeli oluşturmak. Öyle böyle findById(), findByTitle() gibi yöntemleri kullanabilirsiniz. Sadece CamelCase db alanı ihtiyacı ve çok daha hızlı herhangi bir alanda bir arama yapabilirsiniz.

Kek __call() sihirli yöntemini kullanarak bunu yapar. Eğer varsa ve sadece dinamik yöntemi adı ve parametreleri oluşturulan koşullar ile find() veya findAll() çalışır olmayan bir yöntemi uygulamak için çalışıyoruz, bu yöntemi denir. Bu uygulama çok basit ve gerçekten pek çok yarar verebilir.

Ben özel bir dizi, yani unsurları erişmek için) (__ get () ve __ set kullanın:

class Something {
    private $data;

    public function __set($key, $value) {
        //put validation here
        $this->data[$key] = $value;
    }

    public function __get($key) {
        if (!array_key_exists($this->data, $key)) {
             throw new Exception("Invalid member $key.");
        } else {
             return $this->data[$key];
        }
    }
}

Ile bu yüzden bazı doğrulama, $ kişi-> yaş = (yaş bir ortak üye olsaydı iyi olurdu oysa.) "Asdf" hemen bir istisna atmak istiyorsunuz gibi bir şey

Ayrıca __ set () size sınıfta keyfi 'üye' istemiyorsanız tuşları geçerli ne sınırlayabilir.

Bazı örnek:

class formatedContainer {
    private $holder;
    protected $mode = "formated";

    public function __set($var, $value) {
        $formated = chunk_split($value, 4, "-");
        if(substr($formated, -1) == "-") 
            $formated = substr($formated, 0, strlen($formated) - 1);
        $this->holder[$var] = array('formated' => $formated, 'plain' => $value);
    }

    public function __get($var) {
        return $this->holder[$var][$this->mode];
    }

    public function getPlain() {
        $this->mode = "plain";
    }

    public function getFormated() {
        $this->mode = "formated";
    }
}

$texts = new formatedContainer();
$texts->myText = md5(uniqid());
$texts->anotherText = md5("I don't change!");

//Prints something like: 440e-6816-b2f5-7aa5-9627-9cc8-26ef-ef3b
echo $texts->myText;

$texts->getPlain();

//Prints something like: 8559d37c5a02714dca8bd1ec50a4603a
echo "<br/>" . $texts->anotherText;

Kinda işe yaramaz, ama ben size bir fikir edinebilirsiniz düşünüyorum. :}

Web üzerinde bir çok örnek özel bir "özellik dizisinde" ile birlikte __get() ve __set() kullanarak, var. Daha kendini belgeleyen kodu ve benim ide Normalde kod tamamlama, vb yapmak için yeteneği veren için, bu özellikler - eğer benim sınıf tanımlarında istedim ilginç büküm, aslında ortak özelliklerini beyan ve hala bu sihirli interceptors kullanmak mümkün değildir bildirilen, __get() ve __set() denilen almazsınız. Ben buldum ben unset() benim sınıf yapıcısı bu aynı özellikleri, ben her iki dünyanın en iyi olsun eğer.