2012-05-12 86 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

在你的父类中,你已经定义了一个构造函数方法。并且数据库对象的初始化在父类中完成。当你定义一个子类,并定义同名的方法,父母的在这里做的是重写父的方法,将孩子这么例如

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

,现在你有另一个类继承什么PHP父类

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 ; 
    } 
} 
?>