проблемы при расширении класса PHP - PullRequest
0 голосов
/ 29 января 2011

У меня есть 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();

Когда я хочу использовать свою новую функцию total ($ 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

Я включил 2 класса в свой файл main.php, например:



include 'class/db.class.php';
include 'class/user.class.php';


Редактировать 1:

Связанный пост: лучший прием при использовании расширяющего класса (PHP)

Ответы [ 5 ]

1 голос
/ 29 января 2011

Ну да, $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 голос
/ 29 января 2011

Я полагаю, что вы хотите вызвать родительскую функцию, поэтому попробуйте выполнить следующее:

 function Total($table) {
      $query = parent::Execute("SELECT * FROM $table");
      $total = parent::NumRows($query);
      return $total;
    }

И если это не работает, попробуйте использовать this вместо parent

PHP родительская совместимость

0 голосов
/ 29 января 2011

Решение для моей проблемы:


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

0 голосов
/ 29 января 2011

Похоже, вы не понимаете, как работает наследование. Подкласс наследует открытые и защищенные члены и методы родительского класса. Поэтому в приведенном вами примере вы, вероятно, должны использовать $this->Execute("SELECT * FROM $table") и $this->NumRows($query). Хотя функции Execute и NumRows не определены в классе User, они находятся в классе DBManager, поэтому вы получаете к ним доступ, как если бы они были определены в User.

0 голосов
/ 29 января 2011

Что это за $ 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...