0

基本クラスと、基本クラスを拡張する 2 番目のクラスがあります。問題は、子クラスから $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 に答える