我有一个基类和一个扩展基类的第二个类。问题是我无法从子类访问$ 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);
答案 0 :(得分: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如何处理方法覆盖。
答案 1 :(得分: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);
答案 2 :(得分:0)
您需要在班级Facebook_Login
只需添加parent::__construct()
所需的参数。
答案 3 :(得分:0)
使用此:
<?php
class Facebook_Login extends Base_Login
{
public function __construct($app_id, $secret)
{
parent::__construct();
var_dump($this->db);
echo $this->member_uri ;
}
}
?>