2010-09-13 20 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())返回一个错误。

相关问题