我创建了一个简单的数据库连接类:
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->方法。
非常感谢你的时间。
汤姆
答案 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作为提供程序来管理依赖注入,而不是手动执行。