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」をエコーします
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原則 に従うことができますが、必要な機能はすべて提供できます。
継承されているので、そのままエコーします
echo $this->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 parent::$this->bb; //works by M
}
}
$test = new B($some);
$test->childfunction();`
parent::$bb;
を使用すると、$bb
の値で定義された静的定数を取得しようとします。
代わりに:
echo $this->bb;
注: Bがそれを呼び出す唯一のクラスである場合、parent::_construct
を呼び出す必要はありません。 Bクラスで__constructを宣言しないでください。
$ 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();
親クラスのすべてのプロパティとメソッドは子クラスで継承されるため、理論的には子クラスでそれらにアクセスできますが、子で使用すると致命的なエラーがスローされるため、クラスでprotected
キーワードを使用してくださいクラス。
php.net で述べたとおり
プロパティまたはメソッドの可視性は、キーワードpublic、protectedまたはprivateを宣言の前に付けることで定義できます。 publicと宣言されたクラスメンバーはどこからでもアクセスできます。 protectedと宣言されたメンバーは、クラス自体内、および継承された親クラスによってのみアクセスできます。プライベートとして宣言されたメンバーは、メンバーを定義するクラスによってのみアクセスできます。