我有两个班级:
在数据库类中,我创建了一个与mysqli一起使用的对象,用于整个脚本。当我尝试从.php文件中的数据库类调用函数时,它可以正常工作。
简化数据库类:
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;
答案 0 :(得分:3)
您的getCol函数需要global $db;
。
function getCol($table) {
global $db;
$q = "SELECT * from " . $table . ";";
$res = $db->query($q);
return $res;
}
根据以下评论进行修改。
另一种选择是将DB存储为类中的属性。以下是简化的回复。 (您应该考虑将var $db
设为私有并通过构造函数传入。有关更多详细信息,请参阅有关变量范围和对象构造函数的文档。)
class Libtables {
var $db;
function getCol($table) {
$q = "SELECT * from " . $table . ";";
$res = $this->db->query($q);
return $res;
}
}
$oLibtables = new libtables();
$oLibtables->db = $db;
答案 1 :(得分:1)
您遇到的问题与范围有关。 $db
变量未在Libtables
类中初始化。
你可以通过在你需要使用它的函数中定义$db
变量global来解决这个问题,即
class Libtables
{
public function getCol($table)
{
global $db;
$q = "SELECT * from " . $table . ";";
$res = $db->query($q);
return $res;
}
}
或者你可以通过类构造函数注入变量,这样你就可以在任何地方使用它(比使用全局变量更简洁的代码)。
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;
}
}
创建Libtables
$db = new Database(DB_HOST, DB_USER, DB_PASS, DB_NAME);
.....
$lib = new Libtables($db);
HTH
答案 2 :(得分:0)
谢谢大家。它现在可以将Database对象传递给libtables类。