我将使用单例类来管理数据库连接和对应用程序设置的引用。
为了访问db类,必须在每个方法中使用以下代码似乎有点混乱。
$db = DB::getInstance();
有更有效的方法吗?
任何建议表示赞赏。
由于
答案 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,以便您可以随时访问数据库而不用担心!