2010-09-29 35 views
5

我有一个数据库类,它用于选择,更新,删除MySQL查询。如何访问另一个类的对象?

现在,我想在另一个类中创建一个MySQL查询,但是如果我在index.php中定义了$db = new DB();,我不能在另一个类中使用$db var。如果我想进行查询,是否必须一遍又一遍地定义变量$db?或者有没有办法使$db VAR与一个对象的全局变量?

回答

0

在你index.php文件使用

require_once('path_to_file_with_class.php'); 

您也可以使用include_once,它会给你一个警告而不是错误的,如果“path_to_file_with_class.php”文件不可用。

-1

你可以将其定义为在你的index.php文件全球性的,在类的构造也把$this->db &= $GLOBALS['db'];

5

你可能需要一个singleton。这使您可以在代码中的任何位置获取数据库实例。然后在任何你想做查询的地方,首先做$db = DB::getInstance();

另一种方法是dependency injection,它将数据库实例传递给所有需要一个的类。

+0

在PHP Singleton模式的例子可以在这里找到:http://www.weberdev.com/get_example-4002.html – Zilverdistel 2010-09-29 09:03:51

+0

使对象全局可用,你只需要一个静态方法来初始化它。它不一定是Singleton。两者都是臭的,所以依赖注入是一条路。 – Gordon 2010-09-29 09:09:55

0

在一个类上定义它(单独的PHP文件)。然后需要它为每个需要var的PHP文件。

0

首先让你的数据库类为singleton。然后在你的新课堂上,你可以做类似:

class myNewClass{ 
    private $_db; 

    public function __construct(){ 
    $this->_db = DB::getInstance(); 
    } 
} 
0

使用魔术功能__autoload()

11

最简洁的方法是将aggregate数据库类别所需的injecting它。所有其他方法(如使用global关键字或使用static方法,更不用说Singleton)正在引入类与全局范围之间的紧密耦合,这使应用程序难以测试和维护。只要做到

// index.php 
$db = new DBClass;    // create your DB instance 
$foo = new SomeClassUsingDb($db); // inject to using class 

class SomeClassUsingDb 
{ 
    protected $db; 
    public function __construct($db) 
    { 
     $this->db = $db; 
    } 
} 

使用Constructor Injection如果需要依赖为实例创建一个有效的状态。如果依赖关系是可选的或需要在运行时可互换,则使用Setter Injection,例如,

class SomeClassUsingDb 
{ 
    protected $db; 
    public function setDb($db) 
    { 
     $this->db = $db; 
    } 
} 
+0

我到底该如何使用$ db var? $这 - > DB->选择(); ? – Mike 2010-10-02 20:46:08

+0

@Mike是的,完全像这样。或者通过吸气(如果你写了一个) – Gordon 2010-10-03 15:57:16