2010-01-23 36 views
2

如果我創建一個註冊表對象存儲在像這樣的其他對象和設置...PHP中的註冊表類會像這樣工作嗎?

$registry = Registry::getInstance(); 

然後創建其他兩個對象,並通過註冊表對象到他們喜歡這個下面......

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

,然後在我的一些對象添加到註冊表對象的腳本後...

// 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); 

將在爲C核心服務器與數據庫對象的方法在頂部仍然存在,仍然可以訪問我存儲到註冊表中的所有對象,即使在創建核心和數據庫對象之後,其他對象已存儲到註冊表中?

回答

1

是它們會,對象是通過引用傳遞(在PHP> = 5),因此,每個變量將是指相同的底層對象。

在以前的PHP,你需要通過裁判經過:

$obj->registry =& $registry; 

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

在PHP < 5關鍵是語法符號時,分配和函數聲明。

0

不,默認情況下不是。幾乎在所有情況下,參數都以PHP的值傳遞。你想要的是所謂的「通過參考」,你可以閱讀更多關於in the manual

+0

PHP自第5版以來的對象默認通過引用傳遞。 – Crozin 2010-01-23 21:30:42

+0

如果這個類實現單例模式,這些類共享相同的實例 – 2010-01-23 21:31:09

1

如果它的對象的實例是肯定的 - 否則它們將不得不使用共享內存來傳遞對象,否則你將無法訪問它們。

但是,我想你的註冊表是一個單身權利?所以是的。

編輯:也許Im不理解您的問題....

+0

註冊表是一個單例 – JasonDavis 2010-01-23 21:38:24

1

是的,他們可以訪問這些對象,但IMO Registry並不是這裏最好的解決方案 - 上下文會更好,因爲它允許您爲每個屬性建模。它還可以100%確保當您撥打$registry->get('user')時,會返回一些User對象。

語境是相當類似註冊地:

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 
} 

,並在以後使用它:

$db = $contextObject->getDatabase(); 

當您使用註冊表你沒有100%地肯定$ DB是那麼對象PDO(在本例中)在某些情況下可能會導致一些問題。

+0

我是錯的還是這與註冊表非常相似?我是否還需要將這個Context對象傳遞給所有其他對象?只是問我是新來的 – JasonDavis 2010-01-24 02:13:06

+0

是的,你仍然需要將Context實例傳遞給其他對象。 Context和Registry之間的主要區別在'setDatabase'和'setLogger'方法中可見。當你使用註冊表時,你不能做這樣的事情。 – Crozin 2010-01-24 10:34:52