PHP parent
クラス
前回に引き続いて今回もクラスについて記述していきたいと思います。
親クラス内の静的なプロパティへのアクセス
以前、static文で宣言されたクラス内の静的なプロパティやメソッド(インスタンス化せずにアクセスすることができるプロパティやメソッド)へのアクセス方法で
クラス外や、自クラス内からのアクセス方法を記述しましたが、
基底クラスを継承した派生クラス内から、基底クラス内の static 宣言された静的なプロパティやメソッドへアクセスしたい場合は parent を使用します。
parentの記述方法
parent は派生クラス内から継承元の基底クラス内の static で定義されたプロパティやメソッドにアクセスする際に使用します。
具体的な記述方法は下記のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 | class 基底クラス名{ static public プロパティ名 = '値' ; static public function メソッド名(){ メソッド内の処理; } } class 派生クラス名 extends 基底クラス名{ public funtion メソッド名(){ parent::基底クラス内の static 宣言したプロパティ名; parent::基底クラス内の static 宣言したメソッド名(); } |
parentを使用したサンプル
以下では parent を使用して基底クラス内のメソッドにアクセスしてその値を表示しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php class test{ static public $value1 = "1000<br>" ; } class subtest extends test{ public function func1(){ echo parent:: $value1 ; } } $obj = new subtest; $obj ->func1(); ?> |
基底クラスでは static 宣言しているので、下記のようにインスタンス化しなくても
クラス外からアクセスが可能なプロパティになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?php class test{ static public $value1 = "1000<br>" ; } class subtest extends test{ public function func1(){ echo parent:: $value1 ; } } $obj = new subtest; $obj ->func1(); echo test:: $value1 ; ?> |
static 宣言をしていないプロパティを派生クラス側から parent で参照しようとすると
エラーになってしまうので注意が必要です。
また下記のように static 宣言したメソッドも parent を用いてアクセスすることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php class test{ static public function func2(){ echo "in func2<br>" ; } static public function func3(){ echo "in func3<br>" ; } } class subtest extends test{ public function func1(){ echo parent::func2(); } } $obj = new subtest; $obj ->func1(); test::func3(); ?> |
ただしプロパティの場合は static 宣言していないものを parent で参照するとエラーになりますが、
メソッドの場合は static 宣言していなくてもエラーにならずに実行できてしまいます。
以下は先ほどのコードから func2 の static を抜いて実行しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php class test{ public function func2(){ echo "in func2<br>" ; } static public function func3(){ echo "in func3<br>" ; } } class subtest extends test{ public function func1(){ echo parent::func2(); } } $obj = new subtest; $obj ->func1(); test::func3(); ?> |
今回はここまでにします。