如何从另一个类访问对象?

时间:2010-09-29 08:55:31

标签: php class

我有一个数据库类,用于进行选择,更新,删除MySQL查询。

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

制作$db var

7 个答案:

答案 0 :(得分:11)

最简洁的方法是aggregate injecting所需的数据库类global。所有其他方法,例如使用static关键字或使用Constructor Injection方法,更不用说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;
    }
}

如果需要依赖关系来为实例创建有效状态,请使用{{3}}。如果依赖项是可选的或者需要在运行时可以互换,请使用Setter Injection,例如

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

答案 1 :(得分:5)

您可能需要singleton。这为您提供了一种在代码中的任何位置获取DB实例的方法。然后,在您想要查询的任何地方,首先执行$db = DB::getInstance();

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

答案 2 :(得分:0)

index.php文件中使用

require_once('path_to_file_with_class.php');

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

首先使您的数据库类成为singleton。然后在你的新课程中你可以做类似的事情:

class myNewClass{
  private $_db;

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

答案 5 :(得分:0)

使用魔术功能__autoload()

答案 6 :(得分:-1)

您可以在index.php文件中将其定义为全局,并且在类构造函数中也放置$this->db &= $GLOBALS['db'];