Tips

2014.09.16

PHP 静的なメンバ変数やメンバメソッドへのアクセス4 【初級編 第57回】

PHP

クラス

今回も前回に引き続いてクラスについて記載していきたいと思います。

遅延静的束縛について

今回も前回同様、遅延静的束縛の呼び出し方や注意点などについて記述していきたいと思います。

オブジェクトを使った場合でも使用可能

遅延静的束縛はオブジェクトを使用した場合でも使用することが可能です。
以下のようにするとオブジェクトから遅延静的束縛によって、
各クラス内のメソッドを実行することができます。

<?php

 class class01{

    public static function func01(){
      static::func02();
    }

    public static function func02(){
      echo "class01内のfunc02の処理";
    }

  }

 class class02 extends class01{

    public static function func02(){
       echo "class02内のfunc02の処理";
    }

 }

 class class03 extends class02{

    public static function func02(){
       echo "class03内のfunc02の処理";
    }

 }

 $obj01 = new class01();
 $obj01->func01();
 $obj02 = new class02();
 $obj02->func01();
 $obj03 = new class03();
 $obj03->func01();

?>

結果は以下のようになり、それぞれのクラス内の func02 が呼び出されています。

ブラウザ確認画像

クラス内で別のクラスを呼び出した場合の遅延静的束縛の動作

遅延静的束縛は static:: を最後に呼び出しているクラス名を保持するものなので、
以下のようにして呼び出した場合は、class01を呼び出した直後に、 static::func02();
呼び出しても、static::自体を呼び出しているのは class03なので、
class03 内の func02が呼び出されるということになります。

<!--?php <br ?-->
 class class01{

    public static function func01(){
      static::func02();
    }

    public static function func02(){
      echo "class01内のfunc02の処理
";
    }

  }

 class class02 {

    public static function func01(){
      static::func02();
    }

    public static function func02(){
       echo "class02内のfunc02の処理
";
    }

 }

 class class03 {

    public static function func01(){
      static::func02();   //class03内のfunc02の処理が実行される
      class01::func01();  //class01内のfunc02の処理が実行される
      static::func02();   //class03内のfunc02の処理が実行される
      class02::func01();  //class02内のfunc02の処理が実行される
      static::func02();   //class03内のfunc02の処理が実行される
    }

    public static function func02(){
       echo "class03内のfunc02の処理
";
    }

 }

 class03::func01();

?>

結果は次のようになり、static自体を呼び出している class03 内の処理が実行されています。

ブラウザ確認画像

今回はここまでにします。

新連載はじまりました!新PHP基礎 連載リンク

PHP基礎 連載

Recent News

Recent Tips

Tag Search