PHP mysqli“;对非对象调用成员函数query();来自其他班级
可能重复:PHP mysqli“;对非对象调用成员函数query();来自其他班级,php,mysqli,Php,Mysqli,可能重复: 我有两门课: 数据库类 Libtables类 在数据库类中,我创建了一个对象,用于在整个脚本中使用mysqli。当我试图从.php文件中的数据库类调用函数时,它会起作用 简化数据库类: class Database { protected static $_instance; protected $_mysqli; protected $_query; public function __construct($host, $username, $password, $db)
我有两门课:
class Database {
protected static $_instance;
protected $_mysqli;
protected $_query;
public function __construct($host, $username, $password, $db) {
$this->_mysqli = new mysqli($host, $username, $password, $db)
or die("There was a problem connecting to the database");
}
public function close() {
$this->_mysqli->close();
}
public function query($q) {
return $this->_mysqli->query($q);
}
}
但是,当我试图从Libtables类中的数据库类调用函数时,它失败了,我得到了一个名为:
“对非对象调用成员函数query()”
简化Libtables类:
class Libtables {
function getCol($table) {
$q = "SELECT * from " . $table . ";";
$res = $db->query($q);
return $res;
}
}
我通过以下方式创建了一个数据库类对象:
$db = new Database(DB_HOST, DB_USER, DB_PASS, DB_NAME);
global $db;
您需要
global$db代码>在getCol函数中
function getCol($table) {
global $db;
$q = "SELECT * from " . $table . ";";
$res = $db->query($q);
return $res;
}
根据下面的评论进行编辑
另一个选项是将DB作为属性存储在类中。以下是一个简化的回答。(您应该考虑将var$db
设为私有并通过构造函数传入。有关更多详细信息,请参阅有关变量范围和对象构造函数的文档。)
您遇到的问题与范围有关。$db
变量未在Libtables
类中初始化
您可以通过在需要使用的函数中定义$db
变量global来实现这一点,即
class Libtables
{
public function getCol($table)
{
global $db;
$q = "SELECT * from " . $table . ";";
$res = $db->query($q);
return $res;
}
}
或者,您可以通过类构造函数注入变量,以便可以在任何地方使用它(代码比使用globals更简洁)
创建Libtables
$db = new Database(DB_HOST, DB_USER, DB_PASS, DB_NAME);
.....
$lib = new Libtables($db);
谢谢大家。现在,它可以将数据库对象传递给libtables类。您是否阅读了有关的文档?但是如果该类中有100个函数,是否需要添加全局$db;每一个功能?是的,如果你这样做的话。另一种方法是将DB连接存储为类的属性,并引用$this->DB->query()@Angelo a:justice。这就是为什么global
是邪恶的。您需要将其传递给Libtables
构造函数,并将其存储为类属性这不是我对受保护变量$\u mysqli所做的吗?受保护变量在数据库类中,而不是在Libtables中。您可以让libtables扩展数据库,但我认为这不是您想要做的。
class Libtables
{
private $_db;
public function __construct($db)
{
$this->_db = $db;
}
public function getCol($table)
{
$q = "SELECT * from " . $table . ";";
$res = $this->_db->query($q);
return $res;
}
}
$db = new Database(DB_HOST, DB_USER, DB_PASS, DB_NAME);
.....
$lib = new Libtables($db);