2016-04-18 2 views
-1

Я создал два класса, USER и ADMIN, а администратор расширяет пользователя.PHP oop наследование PDO-соединения с базой данных mysql

Я могу получить любые данные, которые мне нужны из базы данных при использовании объекта класса USER, но я не могу получить какие-либо данные при работе с объектом ADMIN. классов следующим образом:

 class USER 
     { 
      private $conn; 
      public function __construct() 
      { 
       $database = new Database(); 
       $db = $database->dbConnection(); 
       $this->conn = $db; 
      } 
      public function runQuery($sql) 
      { 
       $stmt = $this->conn->prepare($sql); 
       return $stmt; 
      } 

     ...some functions to query the DB 

     } 

и

class ADMIN extends USER 
{ 
private $conn; 

public function __construct() 
{ 
    $database = new Database(); 
    $db = $database->dbConnection(); 
    $this->conn = $db; 
} 
...some other functions to query the DB 
} 

на первом я не включили конструктор, так как я прочитал, что администратор будет наследовать все не private свойства, так что это моя вторая попытка, но в в обоих случаях я получил эту ошибку:

Call to a member function prepare() on a non-object любая идея, что мне не хватает? ТНХ

UPDATE: я иметь эту функцию, например, в ADMIN классе:

public function getAppeals($user_id){ 
    $stmt = $this->conn->prepare("SELECT * FROM appeals WHERE lecturer_id = :lecturer_id"); 
    $stmt->execute(array(':lecturer_id' => $user_id)); 
    $userRow = $stmt->fetchall(PDO::FETCH_ASSOC); 
    return $userRow; 
} 

строка, которая генерирует ошибку заключается в следующем:

$stmt = $this->conn->prepare("SELECT * FROM appeals WHERE lecturer_id = :lecturer_id");

+2

Пользователь, добавляющий администратора, обращается ко мне назад - администратор - это подмножество ваших пользователей, а не наоборот. Создание соединения с базой данных в каждом классе - плохой вызов - передать существующее соединение в класс из вашего всеобъемлющего приложения. – ceejayoz

+0

@ceejayoz Yea Я тоже видел это, но это не то, что он на самом деле делает, если вы посмотрите на код – RiggsFolly

+3

Вы уверены, что хотите написать свой собственный ORM, когда есть много таких, как [Doctrine] (http: //www.doctrine- project.org/) и [Propel] (http://propelorm.org/), которые полнофункциональны и протестированы? – tadman

ответ

3

Это должно объяснить проблему http://php.net/manual/en/language.oop5.visibility.php

Частная собственность только видимый в классе, в котором он был определен. Однако, делая это protected позволит ему получить доступ из любого класса, который расширяет USER так будет видна ADMIN если вы запустите родительский конструктор из класса ADMIN как этот parent::__construct();

Если вы сделаете эти изменения, он должен работать

class USER 
{ 
    //private $conn; 
    protected $conn; 

    public function __construct() 
    { 
     $database = new Database(); 
     $db = $database->dbConnection(); 
     $this->conn = $db; 
    } 
    public function runQuery($sql) 
    { 
     $stmt = $this->conn->prepare($sql); 
     return $stmt; 
    } 

...some functions to query the DB 

} 

class ADMIN extends USER 
{ 

    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function getAppeals($user_id){ 
     $stmt = $this->conn->prepare("SELECT * FROM appeals WHERE lecturer_id = :lecturer_id"); 
     $stmt->execute(array(':lecturer_id' => $user_id)); 

     $userRow = $stmt->fetchall(PDO::FETCH_ASSOC); 

     return $userRow; 
    } 
} 
+0

Это, наверное, случай здесь, и я согласен с тем, что сделать его «защищенным» - это путь, но ошибка не отражается в коде OP, потому что '$ this-> conn' определяется как в' USER', так и в 'ADMIN', поэтому он доступен для обоих. Класс 'ADMIN' может получить доступ к собственному свойству' $ conn', а 'USER' может получить доступ к собственному свойству' $ conn', но 'ADMIN' не может получить доступ к' USER' '$ conn'. Когда 'ADMIN' выполняет метод, унаследованный от' USER', он попытается использовать 'conn' из' USER'l, и в этом случае он не сможет получить к нему доступ. Я предполагаю, что это происходит где-то вдоль линии. – Mike

+0

Исправьте меня, если я ошибаюсь. – Mike

+0

Вот пример того, что я имею в виду: https: // 3v4l.org/UPc9k – Mike