web-dev-qa-db-ja.com

PHP親クラス変数へのアクセス

class A {
    private $aa;
    protected $bb = 'parent bb';

    function __construct($arg) {
       //do something..
    }

    private function parentmethod($arg2) {
       //do something..
    }
}

class B extends A {
    function __construct($arg) {
        parent::__construct($arg);
    }
    function childfunction() {
        echo parent::$bb; //Fatal error: Undefined class constant 'bb' 
    }
}

$test = new B($some);
$test->childfunction();

質問:子の親変数を表示するにはどうすればよいですか?期待される結果は「parent bb」をエコーし​​ます

34
Kuntau
echo $this->bb;

変数は継承され、プライベートではないため、現在のオブジェクトの一部です。


parent::の使用に関する詳細情報のリクエストに対する追加情報を次に示します。

親クラスのメソッドにadd追加機能を追加する場合は、parent::を使用します。たとえば、Airplaneクラスを想像してください:

class Airplane {
    private $pilot;

    public function __construct( $pilot ) {
        $this->pilot = $pilot;
    }
}

ここで、ナビゲーターも備えた新しいタイプの飛行機を作成するとします。 __construct()メソッドを拡張して新しい機能を追加できますが、それでも親が提供する機能を利用できます。

class Bomber extends Airplane {
    private $navigator;

    public function __construct( $pilot, $navigator ) {
        $this->navigator = $navigator;

        parent::__construct( $pilot ); // Assigns $pilot to $this->pilot
    }
}

このようにして、開発の DRY原則 に従うことができますが、必要な機能はすべて提供できます。

60
George Cummins

継承されているので、そのままエコーします

echo $this->bb;
6
class A {
    private $aa;
    protected $bb = 'parent bb';

    function __construct($arg) {
       //do something..
    }

    private function parentmethod($arg2) {
       //do something..
    }
}

class B extends A {
    function __construct($arg) {
        parent::__construct($arg);
    }
    function childfunction() {
        echo parent::$this->bb; //works by M
    }
}

$test = new B($some);
$test->childfunction();`
4
user2147836

parent::$bb;を使用すると、$bbの値で定義された静的定数を取得しようとします。

代わりに:

echo $this->bb;

注: Bがそれを呼び出す唯一のクラスである場合、parent::_constructを呼び出す必要はありません。 Bクラスで__constructを宣言しないでください。

3
corretge

$ bbは、保護されたクラスAを拡張した後、クラスBのプライベートメンバーになりました。

したがって、クラスBの属性のように$ bbにアクセスします。

class A {
    private $aa;
    protected $bb = 'parent bb';

    function __construct($arg) {
       //do something..
    }

    private function parentmethod($arg2) {
       //do something..
    }
}

class B extends A {
    function __construct($arg) {
        parent::__construct($arg);
    }
    function childfunction() {
        echo $this->bb; 
    }
}

$test = new B($some);
$test->childfunction();
2
FinalForm

親クラスのすべてのプロパティとメソッドは子クラスで継承されるため、理論的には子クラスでそれらにアクセスできますが、子で使用すると致命的なエラーがスローされるため、クラスでprotectedキーワードを使用してくださいクラス。
php.net で述べたとおり

プロパティまたはメソッドの可視性は、キーワードpublic、protectedまたはprivateを宣言の前に付けることで定義できます。 publicと宣言されたクラスメンバーはどこからでもアクセスできます。 protectedと宣言されたメンバーは、クラス自体内、および継承された親クラスによってのみアクセスできます。プライベートとして宣言されたメンバーは、メンバーを定義するクラスによってのみアクセスできます。

1
Hamed Momeni