php对象交互 - 在其他实例中调用实例

时间:2014-08-14 23:39:41

标签: php oop

我创建了一个简单的数据库连接类:

class db {

private $db_host = "host";
private $db_user = "user";
private $db_pass = "pass";
private $db_name = "db_name";

public $con;

public function __construct() {
    $this->con = mysqli_connect($this->db_host, ... );
   ...
}

public function query($query) {
   return mysqli_query($this->con,$query);
}
}

现在,我想在另一个类实例中使用$ db-> query():

class display {

public function menu() {
this function creates a list based on a result of $db->query('SQL query')
}
plus various other functions to display different things, all using $db->query()

那么问题是什么?

首先,我通过将'global $ db'添加到$ disply-> menu()来实现这一点,但这显然是一个很大的NO NO,需要在每个方法中指定。

现在可能很清楚,无论何时何地我需要SQL结果,我都希望使用$ db->查询(SQL查询),而不仅仅是在全局范围内。

我花了最后几个小时来查看这个内容,但令我惊讶的是,大多数人都会问如何在全局范围内使用$ instance-> instance->方法。

非常感谢你的时间。

汤姆

1 个答案:

答案 0 :(得分:2)

一个简单的解决方案是在实例化类时注入$ db对象

class Display {

    protected $db;

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

    public function menu() {
        // here you can use $this->db as if it was the global $db;
    }
}

每次实例化类

时,都需要添加$ db作为参数
$mydisplay = new Display($db);

还有其他方法可以达到同样的目的。例如,您可以使$ db类成为单例,并添加静态方法以从您需要的任何位置检索实例。还有更复杂的方法,例如使用pimple作为提供程序来管理依赖注入,而不是手动执行。