0

假设我有一个db在我的类之外创建的实例,比如说调用Foo,我如何使这个db变量在我的类中全局可访问Foo

我知道我可以global db;在任何想要在其中访问它的函数中拥有它Foo(),但是我如何使它成为类的全局对象,以便我可以通过$this->db;

4

4 回答 4

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() );

  } 

}
于 2013-08-26T22:50:16.570 回答
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;
}
于 2013-08-26T23:02:15.073 回答
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.
于 2013-08-26T23:32:03.123 回答
0

也许这会有所帮助。

var $db = new mysqli(/*arguments*/);
class Foo{
  public $db;
  public function __construct($database){
    $this->db = $database;
  }
}
$foo = new Foo($db); $dtb = $foo->db;
于 2013-08-26T23:03:08.250 回答