我有2个班级(2个档案)
db.class.php
user.class.php
我想使用db.class.php
中的一些函数:
db.class.php
Class DBManager {
/** all functions goes here ...*/
}
$DB = new DBManager();
user.class.php的内容是:
Class User extends DBManager {
function User() {
}
function Total($table) {
$query = $DB->Execute("SELECT * FROM $table");
$total = $DB->NumRows($query);
return $total;
}
}
$User = new User();
当我想使用我的新功能总计($ table)时,我得到2个错误:
Undefined variable: DB in ..\class\user.class.php on line 14
Fatal error: Call to a member function Execute() on a non-object in ..\class\user.class.php on line 14
我在main.php文件中包含了两个类,如:
include 'class/db.class.php'; include 'class/user.class.php';
修改1:
答案 0 :(得分:1)
嗯,是的,$DB
未在Total
函数中定义/范围内
如果$DB
是该类的属性,则您需要使用$this->DB
访问它。
更新后更新:
您将DBManager
实例化为全局变量$DB
。此变量仅在全局范围内。它不能自动在任何其他范围内使用,例如内部功能。 User
是否继承自DBManager
完全无关紧要,实例化变量$DB
不在任何函数范围内。
在global
范围内有一种懒惰的方式来访问变量,但我不打算在这里提及。正确的方法是将$DB
实例化为User
的类成员,或在实例化User
时传递它:
class User {
protected $DB = null;
public function __construct($DB) {
$this->DB = $DB;
}
public function Total() {
$this->DB->…
}
}
$DB = new DBManager();
$user = new User($DB);
答案 1 :(得分:1)
我想你想调用父函数,所以尝试类似的东西
function Total($table) {
$query = parent::Execute("SELECT * FROM $table");
$total = parent::NumRows($query);
return $total;
}
如果不起作用,请尝试使用this
代替parent
答案 2 :(得分:0)
那个$ DB是什么?您从未将其设置为任何内容,因此即使您包含这些文件,也无法访问该变量
根据你的db.class.php,你可能需要像这样实例化某种$ DB
$DB = new db();
(在函数本身中,或在使用$this->DB
的用户类的构造函数中)
尝试这样的事情:
Class User extends DBManager {
private $DB;
function User() { // should be __construct() really
$this->DB = new DBManager();
$this->DB->Connect();
}
function Total($table) {
$query = $this->DB->Execute("SELECT * FROM $table");
$total = $this->DB->NumRows($query);
return $total;
}
}
$User = new User();
答案 3 :(得分:0)
看起来你对继承如何工作感到困惑。子类继承父类的public和protected成员和方法。因此,在您给出的示例中,您应该使用$this->Execute("SELECT * FROM $table")
和$this->NumRows($query)
。虽然Execute
类中未定义NumRows
和User
函数,但它们位于DBManager
类中,因此您可以像{User
类中一样定义它们。 1}}。
答案 4 :(得分:0)
我的问题的解决方案是:
$query = DBManager::Execute("SELECT * FROM $table");
$total = DBManager::NumRows($query);