"$ This" içine bir nesne seriyi kaldırmak için bir yolu var mı?

4 Cevap php

Ben bir memcached nesneyi işlemek için bir sınıf yazıyorum. Fikir abstract class Cachable yaratmak ve (örneğin, kullanıcı, Post, vb gibi) tüm önbelleklenemez nesneler alt sınıfları olacağını sınıfı söyledi.

Sınıfı, Load() hangi soyut işlevi LoadFromDB() nesne önbelleğe değilse, yenilemek için işlevler / önbellek geçersiz, vb aramaları gibi bazı yöntem sunmaktadır

Ana problem Load() içinde; Ben benzer bir şey yapmak istedim:

protected function Load($id)
{
    $this->memcacheId = $id;
    $this->Connect();

    $cached = $this->memcache->get(get_class($this) . ':' . $id);

    if($cached === false)
    {
        $this->SetLoaded(LoadFromDB($id));
        UpdateCache();
    } else {
        $this = $cached;
        $this->SetLoaded(true);
    }
}

Ne yazık ki $this olmak $cached (önbelleğe alınan nesne) gerekir; Bunu yapmak için herhangi bir yolu var mı? Kötü bir tasarım fikri "her önbelleklenemez nesne önbelleklenemez sınıfından türeyen" oldu?

4 Cevap

Nasıl yerine $ this önbelleğe $ dan özelliklerini kopyalama hakkında?

foreach (get_object_vars($cached) as $field => $value) {
  $this->$field = $value;
}

"$ This" içine bir nesne seriyi kaldırmak için bir yolu var mı?

Bildiğim kadarıyla (ve güncel cevapları okuma) olduğum gibi, cevap hayır.

Ancak bu sadece bir şey hakkında etrafında örtecek bir dekoratör nesnesi yazmak oldukça önemsiz olurdu ....

 class mydecorator {
    var $mydec_real_obj;
    function deserialize($inp)
    {
       $this->mydec_real_obj=unserialize($inp);
    }
    function __set($name, $val) 
    {
        $this->mydec_real_obj->$name=$val;
    }
    function __call($method, $args)
    {
        return call_user_func_array( 
             array(0=>$this->mydec_real_obj, 1=>$method),
             $args);
    }

 // ... etc

C.

Her zaman bunu statik bir yöntem (aksi geç statik bağlama sorunları nedeniyle arama sınıfını anlatmak için hiçbir yolu yoktur, çünkü 5.3 + sadece Not) yapabiliriz ...

protected static function Load($id) {
    $memcache = Memcache::getInstance();
    $cached = $memcache->get(get_called_class() . ':' . $id);
    if($cached === false) {
        $ret = new static();
        $ret->SetLoaded(LoadFromDB($id));
        UpdateCache();
    } else {
        $ret = $cached;
        $ret->SetLoaded(true);
    }
    return $ret;
}

Kullanımı:

$user = User::load(4);
$user->foo;

Bu malzeme, modern Orm'un mucgh ile sizin için halledilir: Ancak:

http://en.wikipedia.org/wiki/Memento_pattern