Tips

2014.09.07

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

PHP

クラス

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

遅延静的束縛とは何か

PHP5.3 以降では遅延静的束縛という機能が追加されました。

遅延静的束縛とは最後に呼び出したクラスの情報を保持するための機能です。

遅延静的束縛を使用する場合は、static::メソッドのように記述します。
するとこの時指定したメソッドは、このstatic::を最後に呼び出したクラス内のメソッドが処理されます。

ちなみにこの static:: というのは
メンバ変数やメンバメソッドを定義する際の
public static メンバ変数 public static メンバメソッド() とは異なります。

クラスを使用している際に、遅延静的束縛を使用すると、
クラスの継承を使用している場合に、Class名:メソッド のようにして
アクセスした際の挙動を呼び出したクラス名によって変化させることができるようになります。

遅延静的束縛を使用したコードのサンプル

たとえば、下記のように記述した場合、
呼び出し元のクラスに応じて実行される処理を変化させることができるようになります。

<?php

 class class01{

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

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

  }

 class class02 extends class01{

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

 }

 class class03 extends class02{

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

 }

class01::func01();
class02::func01();
class03::func01();

?>

上記ではclass01内のfunc02 をclass02内のfunc02でオーバーライドをして
さらにclass02内のfunc02をclass03内のfunc02でオーバーライドをしているが
結果は次のように、呼び出したクラスに応じて
それぞれのクラス内の func02() が実行されます。

ブラウザ確認画像

これがたとえば static:: ではなく、 self:: にした場合は、
自クラス内のメソッドを呼び出すということになるので、下記のような形になります。

self::を用いてアクセスした場合

<?php

 class class01{

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

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

  }

 class class02 extends class01{

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

 }

 class class03 extends class02{

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

 }

class01::func01();
class02::func01();
class03::func01();

?>

結果は以下のようになり、class01内のfunc02()の処理しか行われません。

ブラウザ確認画像

また $this->メソッド名() を用いた場合は、
オブジェクトのインスタンス経由でアクセスするので、
静的にアクセスするのとはまた異なるということになります。

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

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

PHP基礎 連載

Recent News

Recent Tips

Tag Search