說我有一個db
實例,這個實例在我的班級之外創建,並且被稱爲Foo
,我如何使這個db
變量在我的Foo
類中全局可訪問?在課堂上製作一個外部類變量
我知道我可以有希望內Foo()
訪問任何職能範圍內global db;
,但我怎麼將使全球的類,所以我可以通過$this->db;
說我有一個db
實例,這個實例在我的班級之外創建,並且被稱爲Foo
,我如何使這個db
變量在我的Foo
類中全局可訪問?在課堂上製作一個外部類變量
我知道我可以有希望內Foo()
訪問任何職能範圍內global db;
,但我怎麼將使全球的類,所以我可以通過$this->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.
定理稱之爲[一如既往,罕見的特殊情況應用]:
任何開發人員都應該儘量避免使用任何編程語言的全局變量。
請把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;
}
也許這會有所幫助。
var $db = new mysqli(/*arguments*/);
class Foo{
public $db;
public function __construct($database){
$this->db = $database;
}
}
$foo = new Foo($db); $dtb = $foo->db;
我不明白這一點。你想擴展'Foo'來包含'db'。那麼能夠從'Foo'中調用'db'類並生成'db'類?你確實使用了單詞實例。 – PHPglue