0

我有一个基类和一个扩展基类的第二个类。问题是我无法从子类访问 $db 对象,而是所有普通变量。知道为什么吗?

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);
4

4 回答 4

2

在您的父类中,您已经定义了一个构造方法。并且数据库对象的初始化在您的父类中完成。当您定义一个子类并定义与父类同​​名的方法时,php在这里所做的就是覆盖父类的方法,例如

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

现在你有另一个继承父类的类

class Bar {
    public function a() {

    }
}

php 在这里所做的是忽略父类的方法,只调用子类。解决方法是使用 parent 关键字在子类中调用父类的方法

所以在你的孩子班

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

这将导致执行父方法和子方法。类构造函数也是如此。您需要通过使用在子类中对父构造函数方法进行分类parent::__construct();

希望这可以帮助您了解 php 如何处理方法覆盖。

于 2012-05-12T15:38:34.650 回答
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);
于 2012-05-12T15:36:19.510 回答
0

你需要在类中调用父类的构造函数Facebook_Login

只需添加parent::__construct()所需的参数。

于 2012-05-12T15:36:29.473 回答
0

用这个:

<?php
class Facebook_Login extends Base_Login
{       
    public function __construct($app_id, $secret)
    {
        parent::__construct();
        var_dump($this->db); 
        echo $this->member_uri ;
    }
}
?>
于 2012-05-12T15:54:44.570 回答