PHP bir Registry Class Bu gibi çalışacak?

4 Cevap php

Ben bu gibi diğer nesneleri ve ayarları saklamak için bir kayıt nesnesi oluşturursanız ...

$registry = Registry::getInstance();

Ve sonra 2 diğer nesneleri oluşturmak ve bu aşağıdaki gibi onlara Kayıt nesnesini iletin ...

$core = new core($registry);
$database = Database::getInstance($registry);

ve daha sonra komut ben Registry nesnesine bazı nesneleri eklemek ...

// Store some Objects into our Registry object using a Registry Pattern
$registry->storeObject("database", $database);
$registry->storeObject("session", $session);
$registry->storeObject("cache", $cache);
$registry->storeObject("user", $user);

Üstünde oluşturulan çekirdek ve veritabanı nesneleri yöntemler hala çekirdek ve veritabanı nesneleri oluşturulan SONRA diğer objelerini kayıt içine saklanan olsa bile ben kayıt içine saklamak tüm nesnelere erişimi var mı?

4 Cevap

evet onlar, nesneler referans (php> = 5) tarafından geçirilen bu yüzden iradesi, her bir değişken aynı temel nesneye başvuruyor.

eski php, sen ref geçmek gerekir:

$obj->registry =& $registry;

function f(& $registry) { // $registry is a reference }

atama ve işlev bildirimleri içinde zaman php <5 anahtar ampersanı sözdizimi.

Nesnenin onun aynı örneği, evet daha varsa - yoksa onlar etrafında veya nesneleri geçirmek için paylaşılan bellek kullanmak zorunda olacak, onlara erişimi olmayacaktır.

Ancak, kayıt defteri bir tek doğru olduğunu hayal ediyorum? Yani evet.

edit: belki Im sorunuzu anlayış değil ....

Evet, bu nesneye erişimi gerekir, ama IMO Registry burada en iyi çözüm değildir - bu, her özellik modeli sağlar, çünkü Bağlam çok daha iyi olurdu. Ayrıca size çağırdığınızda $registry->get('user'), bazı User nesne iade edilecektir emin% 100 verir.

Bağlam Registry oldukça benzer:

class Context {
    protected $database;
    protected $user;
    protected $logger;

    public function setDatabse(PDO $database) {
       $this->database = $database;
    }

    public function getDatabase() {
       return $this->database;
    }

    public function setLogger(Logger $logger) {
       if ($logger instanceof MySpecificLogger) {
          // do sth
       }

       $this->logger = $logger;
    }

    // rest of setters/getters
}

Ve daha sonra kullandığınızda:

$db = $contextObject->getDatabase();

Eğer Kayıt Defteri kullandığınızda $ db daha sonra bir nesne olduğundan% 100 emin yok PDO (bu örnekte) olabilir, bazı durumlarda bazı sorunlara neden olur.

Hayır, değil varsayılan. Parametreler hemen hemen her durumda PHP değeri tarafından geçirilir. Denir Ne istiyorum in the manual hakkında daha fazla bilgi okuyabilirsiniz, "referans geçirerek".