2017-02-23 71 views
2

Я новичок в ООП и все еще экспериментирую, может кто-то указать, где моя ошибка? Я получаю ошибкуНеустранимая ошибка: Непринятая ошибка: вызов функции функции-члена() по нуле

Fatal error: Uncaught Error: Call to a member function query() on null on the following line:

Я понял, что соединение DB не наследуются от базового класса, но я понятия не имею, почему.

$user = $this->db->query("SELECT * FROM users WHERE id='".$user_id."' LIMIT 1"); 

class.php

class Core { 
     public $db; 
     public $domain; 
     public $settings; 
     public function getDomain() { 
      return $this->domain; 
     } 
     function __construct($db,$domain) { 
      $this->db = $db; 
      $this->domain = $domain; 
      $this->getSettings(); 
     } 
     public function getSettings() { 
      $settings = $this->db->query("SELECT * FROM settings"); 
      $settings = $settings->fetch_object(); 
      $this->settings = $settings; 
     } 
    } 

    class User extends Core { 
     public $user; 
     function __construct($user_id) { 
      $this->setUser($user_id); 
     } 
     public function setUser($user_id) { 
      $user = $this->db->query("SELECT * FROM users WHERE id='".$user_id."' LIMIT 1"); 
      if($user->num_rows >= 1) { 
       $user = $user->fetch_object(); 
       $this->user = $user; 
      } 
     } 

index.php

$core = new Core($db,$domain); 
$user = new User($_SESSION['user_id']); 

Разъяснение:

Моя переменная дб передаются из моего файла config.php, который я включаю в начале страницы index.php config.php

$_db['host'] = 'localhost'; 
$_db['user'] = 'root'; 
$_db['pass'] = 'root'; 
$_db['name'] = 'social'; 
$db = new mysqli($_db['host'], $_db['user'], $_db['pass'], $_db['name']) or die('MySQL Error'); 
+0

Вы начали сеанс? имеет ли этот массив сеанса значение? –

+0

Yup, сеанс уже запущен. Я думаю, что это связано с тем, что переменная $ db не унаследована или что-то такое. –

+0

Пара вещей продолжается. Не могли бы вы показать, как вы устанавливаете переменную $ db перед записью $ core = new Core ($ db, $ domain) ;? – Yolo

ответ

1

проблема сейчас заключается в том, как ваши вызывающему классы. Функция Core класса __construct() ожидает соединения $ db. В настоящее время класс User должен вызвать функцию конструктора класса Core для инициирования соединения db. Таким образом, у вас есть один вариант, по крайней мере:

Вызов только классы пользователей, как это:

$user = new User($db,$domain,$_SESSION['user_id']); 

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

function __construct($db,$domain,$user_id) { 
    parent::__construct($db,$domain); 
    $this->setUser($user_id); 
} 

Если переменные подключения к базе данных все правильно (host/username/password/port), он должен работать.

1

Если существует способ построения подкласса, подкласс родительского класса будет не может быть использован, если метод вызывается непосредственно

class Core { 
    public $db; 
    public $domain; 
    public $settings; 
    public function getDomain() { 
     return $this->domain; 
    } 
    function __construct($db,$domain) { 
     $this->db = $db; 
     $this->domain = $domain; 
     $this->getSettings(); 
    } 
    public function getSettings() { 
     $settings = $this->db->query("SELECT * FROM settings"); 
     $settings = $settings->fetch_object(); 
     $this->settings = $settings; 
    } 
} 

class User extends Core { 
    public $user; 
    function __construct($user_id,$db,$domain) { 
     parent::__construct($db,$domain); 
     $this->setUser($user_id); 
    } 
    public function setUser($user_id) { 
     $user = $this->db->query("SELECT * FROM users WHERE id='".$user_id."' LIMIT 1"); 
     if($user->num_rows >= 1) { 
      $user = $user->fetch_object(); 
      $this->user = $user; 
     } 
    } 

и в index.php только $user = new User($_SESSION['user_id'],$db,$domain);

0

Он не задает родительский конструктор после наследования.

, например

class Core { 
     public $db; 
     public $domain; 
     public $settings; 
     public function getDomain() { 
      return $this->domain; 
     } 
     function __construct($db,$domain) { 
      $this->db = $db; 
      $this->domain = $domain; 
      $this->getSettings(); 
     } 
     public function getSettings() { 
      $settings = $this->db->query("SELECT * FROM settings"); 
      $settings = $settings->fetch_object(); 
      $this->settings = $settings; 
     } 
} 

class User extends Core 
{ 
    public $user; 

    // parent:param Parameters add 
    function __construct($user_id,$db,$domain) { 
     // parent constructer call 
     parent::__construct($db,$domain); 
     $this->setUser($user_id); 
    } 
    public function setUser($user_id) { 
     $user = $this->db->query("SELECT * FROM users WHERE id='".$user_id."' LIMIT 1"); 
     if($user->num_rows >= 1) { 
      $user = $user->fetch_object(); 
      $this->user = $user; 
     } 
    } 
} 


$user = new User($_SESSION['user_id'],$db,$domain); 

Разве это не нормально? http://php.net/manual/en/language.oop5.decon.php