2010-09-13 19 views
2

我有一個使用註冊表類的web應用程序。註冊表類包含我需要整理應用程序的重要類。在PHP中爲重要的類創建一個很好的註冊表類

我已經使註冊表類成爲Singleton類,並且此類是靜態的。

註冊表類的內容是在這裏:

<?php 
class registry 
{ 
    private static $objects = array(); 
    private static $instance; 

    private function __construct(){} 
    private function __clone(){} 

    public static function singleton() 
    { 
     if(!isset(self::$instance)) 
     { 
      self::$instance = new registry(); 
     } 
     return self::$instance; 
    } 

    public function storeObjects() 
    { 
     $Objects = array_merge($GLOBALS['EXTRA_LIBS'],array('data','page','session','uri','loader','modules')); 

     foreach($Objects as $name) 
     { 
      $this->$name = $name; 
     } 
    } 

    public function __set($object, $key) 
    { 
     require_once(__LIBRARIES . DS . $object . '.class.php'); 
     self::$objects[ $key ] = new $object(self::$instance); 
    } 

    public function __get($key) 
    { 
     if(is_object (self::$objects[ $key ])) 
     { 
      return self::$objects[ $key ]; 
     } 
    } 

    public function returnAllObjects() 
    { 
     return self::$objects; 
    } 
} 
?> 

現在,每當我想在這裏使用的類在我的應用我做的一個:

registry::singleton()->data->adddata('somedata'); 

我用的是類很多在我的申請中,每種方法至少有一次。現在

我的問題是什麼是做的最好的事情:

1)調用整個事情每次

2)班$registry = registry::singleton();一次在每一個方法,然後只用局部變量。 (我不知道這是否會起作用)

還是有更好的方法來解決這個問題。

回答

2

是否將註冊表實例分配給本地變量是不相關的。如果這是您唯一關心的問題,請使用代碼在特定代碼塊中更易讀的代碼。

我會更關心必須將Registry類名硬編碼到其他類中,以及我是否真的需要一個Singleton for Registry。看看Dependency Injection

+0

+1依賴注入 – 2010-09-13 07:05:19

0

(2)將工作得很好,試試吧。如果你在每種方法中使用它幾次,它會爲你節省一些打字。

你可以考慮增加一些理智的__set()檢查require_once之前,爲了確保該文件存在,以及記錄和/或如果它不(同爲__get())返回一個錯誤。

相關問題