扩展PHP类时出现问题

时间:2011-01-29 10:41:52

标签: php class extend

我有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:

相关文章:best trick when using an extending class (PHP)

5 个答案:

答案 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

PHP parent codumentation

答案 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类中未定义NumRowsUser函数,但它们位于DBManager类中,因此您可以像{User类中一样定义它们。 1}}。

答案 4 :(得分:0)

我的问题的解决方案是:


$query = DBManager::Execute("SELECT * FROM $table");
$total = DBManager::NumRows($query);