PHP OO İnşaat İptal

0 Cevap php

Bu aslında ilginç bir soru, ve (aşağıya bakınız) buna düzeltmek kolay (ama çirkin) var.

Bunu yapmak için daha iyi bir yolu var eğer öyleyse ben soruyorum.

Ne yapmak istediğiniz bir nesne yapıcı yerine yeni bir örneği daha başka bir şey dönmek yapıyor.

İşte elde etmek çalışıyorum ne bir örnek var:

$GLOBALS['object_cache']=array();

class Test {
    public function __construct($id=0){
        if(isset( $GLOBALS['object_cache'][$id] ))
            return $GLOBALS['object_cache'][$id];
        $GLOBALS['object_cache'][$id]=$this;
    }
}

$t0=new Test(0);
$t1=new Test(1);
$t01=new Test(0);
// modifying $t01 would presumably also modify $t0

(? Ama çirkin) kolay düzeltme:

$GLOBALS['object_cache']=array();

class Test {
    public static function create($id=0){
        if(isset( $GLOBALS['object_cache'][$id] ))
            return $GLOBALS['object_cache'][$id];
        $new=new Test();
        $GLOBALS['object_cache'][$id]=$new;
        return $new;
    }
}

$t0=Test::create(0);
$t1=Test::create(1);
$t01=Test::create(0);
// modifying $t01 would presumably also modify $t0

Siz ne düşünüyorsunuz? Örnek 1 arada, çalışmaz; ne olursa olsun return deyimi yeni bir örneğini döndürür.

Bu yüzden daha iyi bir şekilde ikinci bir şey eksik, ya ben?

PS: (Fabrika / tekiz) desenleri hakkında bariz belirten gerek yok ...

0 Cevap