OO PHP在哪里引用单例类?

时间:2009-10-30 12:06:56

标签: php singleton

我将使用单例类来管理数据库连接和对应用程序设置的引用。

为了访问db类,必须在每个方法中使用以下代码似乎有点混乱。

$db = DB::getInstance();

有更有效的方法吗?

任何建议表示赞赏。

由于

4 个答案:

答案 0 :(得分:0)

它并不凌乱。这是单身人士的预期行为。实际上,这只是一行代码。你想让它更紧凑吗? :)

答案 1 :(得分:0)

我首选的方法是创建一个Base类,其中所有需要db访问的类都来自。 Base在其构造函数中调用单例。它的所有孩子都调用他们的父构造函数。 e.g:

class Base {
  protected $db;

  public function __construct(){
    $this->db = DB::getInstance();
  }
}

class Achild extends Base {
  protected $var1;

  public function __construct($arg){
     parent::__construct();
     $this->var1=$arg;
  }
}

答案 2 :(得分:0)

我经常使用注册表模式,此行为也会发生。我总是在模型的构造函数中设置一个实例变量来指向Registry条目;

class Registry {
    private static $_instance;
    private $_registry;

    private function __construct() {
        $_registry = array();
    }

    public static function getInstance() {
        if (!Registry::$_instance) {
            Registry::$_instance = new Registry();
        }

        return Registry::$_instance;
    }

    public function add($key, &$entry) {
        $this->_registry[$key] = &$entry;
    }

    public function &get($key) {
        return $this->_registry[$key];
    }

    public function has($key) {
        return ($this->get($key) !== null);
    }
}

模型示例;

class MyModel {
    private $_db;
    public function __construct() {
        $this->_db = Registry::getInstance()->get('dbKey');
    }

    /* Every function has now access to the DAL */
}

实例化示例;

$dal = new Db(...);
Registry::getInstance()->add('dbKey', $dal);
...
$model = new MyModel();
$model->doDbStuff();

另一种方法是始终将引用作为参数传递给每个构造函数。

当然,当模型中的大多数方法都使用引用时,我只使用这种行为,如果只有少数(一个或两个)方法使用引用,我就像你所展示的那样调用Registry / Singleton。

答案 3 :(得分:0)

我知道你的意思...讨厌那个:: getInstance()的东西!所以去使用静态方法:

class DB {
    private static $db;

    public static function getInstance() {
        if(!self::$db) {
            self::$db = new DBconnector();
        }
    }

    public static function query($query) {
        return self::$db->query($query);
    }
}

用法更好:

$result = DB::query('SELECT whatever;');

如果您使用PHP 5.3,您可以编写类似于此的__callStatic,以将所有方法调用转发给该对象:

public static function __callStatic($method, $args) {
    call_user_func_array(array(self::$db, $method), $args);
}

为了让我高兴,添加一个__autoloader,以便您可以随时访问数据库而不用担心!