2012-05-12 20 views
0

У меня есть базовый класс и второй класс, который расширяет базовый класс. Проблема в том, что я не могу получить доступ к объекту $ db из дочернего класса, но все обычные переменные. Любая идея почему?Родительская переменная/класс возвращает null

class Base_Login 
{ 
    protected $member_uri = 'member.php'; 
    protected $db; 

    public function __construct($db_user, $db_password, $db_name, $db_host) 
    { 
     $this->db = new ezSQL_mysql($db_user, $db_password, $db_name, $db_host); 
     var_dump($this->db); //Output: Object content's 
    } 
} 

class Facebook_Login extends Base_Login 
{  
    public function __construct($app_id, $secret) 
    { 
     var_dump($this->db); //Output: NULL 
     echo $this->member_uri //Output: member.php 
    } 
} 

И это, как я называю это:

require("includes/config.php"); 
$base_login = new Base_Login($db_user,$db_password,$db_name,$db_host); 
$base_login->Facebook_Login = new Facebook_Login($facebook_appID,$facebook_secret); 

ответ

2

В родительском классе вы определили метод конструктора. и инициализация объекта базы данных выполняется в вашем родительском классе. когда вы определяете класс ребенка и определить метод с таким же именем, как то, что PHP делает здесь переопределить метод родительского будет ребенок, так, например

class Foo { 
    public function a() { 
     //some code execution are done here 
    } 
} 

и теперь вы еще один класс наследует родительский класс родителя

class Bar { 
    public function a() { 

    } 
} 

то, что здесь делает php, игнорирует метод родителя и вызывает только дочерний класс. workarond этого заключается в том, чтобы вызвать метод вашего родителя в классе ребенка с помощью родительского ключевого слова

так в классе ребенка

class Bar { 
    public function() { 
     //call to parent method. 
     parent::a(); 
    } 
} 

это приведет выполняется родительского процесса, а также метод ребенка. То же самое относится к конструктору класса. вам необходимо создать класс родительского метода-конструктора в вашем дочернем классе, используя parent::__construct();

Надеюсь, это поможет вам понять, как переопределяет метод обработки php.

0

Простой необходимо вызвать родительский конструктор, как:

public function __construct($app_id, $secret, $db_user, $db_password, $db_name, $db_host) 
{ 
    parent::__construct($db_user, $db_password, $db_name, $db_host); 
    var_dump($this->db); //Output: NULL 
    echo $this->member_uri //Output: member.php 
} 

// затем создать facebook Войти объект

new Facebook_Login($facebook_appID, $facebook_secret, $db_user, $db_password, $db_name, $db_host); 
+0

Но почему я могу получить доступ к member_uri переменной, а не объект? – user1384731

0

Вам необходимо вызвать родительский con Конструктор в классе Facebook_Login

Просто добавьте parent::__construct() с необходимыми параметрами.

0

Используйте это:

<?php 
class Facebook_Login extends Base_Login 
{  
    public function __construct($app_id, $secret) 
    { 
     parent::__construct(); 
     var_dump($this->db); 
     echo $this->member_uri ; 
    } 
} 
?> 
Смежные вопросы