PHP
クラス
今回も前回に引き続いてクラスについて記載していきたいと思います。
クラス内の静的なメソッドへのアクセスについて
self文を使用した静的なアクセス
以前にも書きましたが、
self::メンバ変数名やメンバメソッド名
のようにしてアクセスするとクラス内から静的にアクセスすることができます。
この場合呼びだされるメンバ変数やメンバメソッドは static 宣言していないと
エラーになり呼び出せません。
<?php class class01{ public static $var = 10; //static の記述を抜くとエラーになる public function func01(){ echo self::$var; } } $obj = new class01(); $obj->func01(); ?>
以下のようにすればメンバメソッドも呼び出すことができます。
メソッドの場合は static の記述をつけなくても、
静的な静的アクセスとインスタンスメソッドへのアクセス両方対応しているようです。
<?php class class01{ public static $var = 10; //static の記述を抜くとエラーになる public function func01(){ echo self::func02(); } public function func02(){ //static の記述を抜いてもエラーにならなかった echo self::$var; } } $obj = new class01(); $obj->func01(); ?>
以下のようにクラス外から selfを使用して静的なアクセスをすることはできません。
下記の場合はエラーになります。
<?php class class01{ public static $var = 10; //static の記述を抜くとエラーになる。 public static function func01(){ echo self::func02(); } public static function func02(){ echo self::$var; } } self::func01(); ?>
クラスを継承した派生クラス側から基底クラスの静的メンバ変数を呼び出すこともできます。
この場合はエラーなく表示することができます。
<?php class class01{ public static $var = 10; } class class02 extends class01{ public static function func02(){ echo self::$var; } } $obj = new class02(); $obj->func02(); ?>
また以下のように基底クラス側のメソッドを経由して
静的にアクセスすることもできます。
<?php class class01{ public static $var = 10; public static function func01(){ echo self::$var; } } class class02 extends class01{ public static function func02(){ self::func01(); } } $obj = new class02(); $obj->func02(); ?>
以下のようにクラスを継承してメソッドをオーバーライドをした場合に
self を用いてアクセスするとオーバーライドをした派生クラス側のメソッドが実行されます。
<?php class class01{ public function func01(){ self::func02(); } public static function func02(){ echo "class01_func02()"; } } class class02 extends class01{ public function func01(){ self::func02(); } public static function func02(){ echo "class02_func02()"; } } $obj = new class02(); $obj->func01(); ?>
メンバ変数も同じように派生クラス側でオーバーライドをした値が表示されます。
<?php class class01{ public static $var = 10; } class class02 extends class01{ public static $var = 20; public function func02(){ echo self::$var; } } $obj = new class02(); echo $obj->func02(); ?>
これらのことから以下のようなことがわかります。
・selfは同じクラス内の静的な変数やメソッドにアクセスする際に使用する。
・selfは継承をして派生クラス側から実行した場合は、基底クラス側の静的な変数やメソッドを実行できる。
・オーバーライドをしたメソッドをselfで呼び出した場合は、派生クラス側の変数やメソッドが実行される。
今回はここまでで次回からもクラスについて記載していきたいと思います。