在课堂上创建一个外部类变量全局

时间:2013-08-26 22:36:07

标签: php class variables global

说我有一个db实例,它是在我的课外创建的,称为Foo,如何在db课程中全局访问此Foo变量?

我知道我可以在任何想要在global db;内访问它的函数中使用Foo(),但我如何将其设置为全局,以便我可以通过$this->db; < / p>

4 个答案:

答案 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;