2015-09-05 3 views
1

Добраться всем. я закодировал класс, возвращающих меня:PHP Расширяет класс

Notice: Undefined variable: db in /Applications/MAMP/htdocs/Test Vari/index.php on line 12 
Fatal error: Call to a member function row() on null in /Applications/MAMP/htdocs/Test Vari/index.php on line 12 

Это первая часть файла PHP:

session_start(); 
$_SESSION['ID'] = 1; 
require_once 'pass/password.inc.php'; /*Here's the DB Class*/ 

Я продлил класса в другой, вот код:

class pg extends DB{ 
    public $id; 
    function __construct(){ 
     parent::__construct(); 
     $this->id = $_SESSION['ID']; 
    } 
    public function pgname(){ 
     $rs = $db->row("SELECT CONCAT(Nome, ' ', Cognome) FROM Personaggio WHERE id = :id",array("id"=>$this->id)); 
     return($rs); 
    } 
} 
$pg = new pg(); 
print_r ($pg->pgname()); 

$ db-> row() объявлен в классе DB, который я расширил, и я точно знаю, что он работает. Класс DB не инициализирован, и когда я делаю, ошибка же, это, как я это сделать:

class pg extends DB{ 
    public $id; 
    public $db; 
    function __construct(){ 
     parent::__construct(); 
     $this->db = new DB(); 
     $this->id = $_SESSION['ID']; 
    } 
    public function pgname(){ 
     $rs = $db->row("SELECT CONCAT(Nome, ' ', Cognome) FROM Personaggio WHERE id = :id",array("id"=>$this->id)); 
     return($rs); 
    } 
} 

Фатальная ошибка исчезнет, ​​когда я удалить скобки в print_r($pg->pgname);

ответ

0

Первый путь «» dB.php просто отлично, но вы должны помнить, что вы вызываете $db->row(, как она существует в родительском классе, необходимо использовать $this-> на него так

class pg extends DB{ 
    public $id; 
    function __construct(){ 
     parent::__construct(); 
     $this->id = $_SESSION['ID']; 
    } 
    public function pgname(){ 
     $rs = $this->row("SELECT CONCAT(Nome, ' ', Cognome) FROM Personaggio WHERE id = :id",array("id"=>$this->id)); 
     return($rs); 
    } 
} 

$pg = new pg(); 
print_r ($pg->pgname()); 

Кроме того, чтобы сохранить инкапсуляцию класса хорошо и плотно, было бы лучше, чтобы пройти сеанс конструктору, а не получить его от $ _SESSION внутри конструктора, как это:

class pg extends DB{ 
    public $id; 
    function __construct($id){ 
     parent::__construct(); 
     $this->id = $id; 
    } 
    public function pgname(){ 
     $rs = $this->row("SELECT CONCAT(Nome, ' ', Cognome) FROM Personaggio WHERE id = :id",array("id"=>$this->id)); 
     return($rs); 
    } 
} 

$pg = new pg($_SESSION['ID']); 
print_r ($pg->pgname()); 

Я также допускаю вы включили файл, содержащий класс DB?

+0

Да, вот так:

+0

public function pgname ($ id) { $ rs = $ this-> db-> row ("SELECT CONCAT (Nome, '', Cognome) FROM Personaggio WHERE ID =: id", array ("id" => $ Я бы)); return ($ rs); } $ pg = new pg(); echo ($ pg-> pgname ($ _ SESSION ['ID'])); Примечание: Неопределенное свойство: pg :: $ db in/Applications/MAMP/htdocs/Test Vari/index.php в строке 9 Неустранимая ошибка: Позвоните участнику function row() on null in/Applications/MAMP/htdocs/Test Vari/index.php в строке 9 –

+0

Прочитайте мой ответ '$ rs = $ this-> row (" .... 'NOT' $ this-> db -> row ('Вам не нужно' db', поскольку вы расширили класс DB, весь класс рассматривается как единое целое. – RiggsFolly

0

вы должны require_once

+0

Я забыл поставить его, но он находится здесь:

Смежные вопросы