说我有一个db
实例,它是在我的课外创建的,称为Foo
,如何在db
课程中全局访问此Foo
变量?
我知道我可以在任何想要在global db;
内访问它的函数中使用Foo()
,但我如何将其设置为全局,以便我可以通过$this->db;
< / p>
答案 0 :(得分:2)
定理[一如既往,适用罕见的特殊情况]:
任何开发人员都应该尝试使用任何编程语言来避免全局变量。
请将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() );
}
}
答案 1 :(得分:1)
你可以通过几种方式解决这个问题,我这样做的方法是将db
作为静态属性,并在构造函数中将其分配给$this->db
,如下所示:
class Foo {
private $db;
function __construct() {
$this->db = System::$db;
}
}
甚至更好,你可以创建一个方法System::getDB()
并在其中制作$db
单身人士:
static function getDB() {
if (self::$db == null) {
self::$db = new Database();
}
return self::$db;
}
答案 2 :(得分:1)
使用单身人士
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.
答案 3 :(得分:0)
也许这会有所帮助。
var $db = new mysqli(/*arguments*/);
class Foo{
public $db;
public function __construct($database){
$this->db = $database;
}
}
$foo = new Foo($db); $dtb = $foo->db;