2013-08-26 47 views
0

說我有一個db實例,這個實例在我的班級之外創建,並且被稱爲Foo,我如何使這個db變量在我的Foo類中全局可訪問?在課堂上製作一個外部類變量

我知道我可以有希望內Foo()訪問任何職能範圍內global db;,但我怎麼將使全球的類,所以我可以通過$this->db;

+0

我不明白這一點。你想擴展'Foo'來包含'db'。那麼能夠從'Foo'中調用'db'類並生成'db'類?你確實使用了單詞實例。 – PHPglue

回答

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. 
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

您可以有幾種方法來解決這一問題,我會做的方式是讓如果需要的話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; 
} 
0

也許這會有所幫助。

var $db = new mysqli(/*arguments*/); 
class Foo{ 
    public $db; 
    public function __construct($database){ 
    $this->db = $database; 
    } 
} 
$foo = new Foo($db); $dtb = $foo->db;