假设我有一个db
在我的类之外创建的实例,比如说调用Foo
,我如何使这个db
变量在我的类中全局可访问Foo
?
我知道我可以global db;
在任何想要在其中访问它的函数中拥有它Foo()
,但是我如何使它成为类的全局对象,以便我可以通过$this->db;
定理 [一如既往,罕见的特殊情况适用]:
任何开发人员都应该尽量避免在任何编程语言中使用全局变量。
请封装db
在一个类中,并通过方法建立一个定义良好的接口:
class CDb {
protected $_instance;
public function getInstance() {
return $this->_instance;
}
public function setInstance( $newInstance ) {
$this->_instance = $newInstance;
}
}
class CFoo {
public function doSomething( CDB $aDB ) {
print_r( $aDB->getInstance() );
}
}
您可以通过几种方式解决这个问题,我的做法是创建db
一个静态属性并$this->db
在需要时将其分配给构造函数,如下所示:
class Foo {
private $db;
function __construct() {
$this->db = System::$db;
}
}
甚至更好,您可以创建一个方法System::getDB()
并$db
在其中创建一个 Singleton :
static function getDB() {
if (self::$db == null) {
self::$db = new Database();
}
return self::$db;
}
使用单例
class MyDB {
private static $instance;
private $dbh;
private function __construct() {}
public static function getInstance() {
if( !self::$instance ) {
self::$instance = new MyDB();
}
return self::$instance;
}
public function init($host, $user, $pass) {
$this->dbh = new PDO(); // or whatever
}
}
class MyClass {
private $dbh;
public function __construct() {
$this->dbh = MyDB::getInstance();
}
}
$dbh = MyDB::getInstance();
$dbh->init('localhost', 'user', 'pass');
$mine = new MyClass(); // internal dbh is initialized and ready to go, no globals required.
也许这会有所帮助。
var $db = new mysqli(/*arguments*/);
class Foo{
public $db;
public function __construct($database){
$this->db = $database;
}
}
$foo = new Foo($db); $dtb = $foo->db;