PHP5.2で遅延静的束縛

  • 3
    いいね
  • 1
    コメント
この記事は最終更新日から1年以上が経過しています。

__LINE__とか__FILE__とかはあくまで定数なので、デフォルト引数に突っ込むことができます。

<?php
function doSomething($hoge=__LINE__) {
  var_dump($hoge);
}

…で、何が嬉しいのかですが、PHP5.3未満でLate Static Binding(遅延静的束縛)みたいなことをやるときに使えます。

PHP5.3だと、こんな風になりますね。

<?php
class A {
  static function hoge() {
    var_dump(get_called_class());
  }
}

class B extends A {}
class C extends B {}

A::hoge(); //A
B::hoge(); //B
C::hoge(); //C

//staticメソッドで、どのクラスのメソッドとして呼ばれたか判定が可能

LSBはPHP5.3以降に搭載された機能なので、これはPHP5.2で動きません。
5.2などというレガシーな環境を今時使う人は少ないかもしれませんが…

以下の様な書き方をすることで、5.2でもLSBを真似ることができます。(再現ではないし効率は悪いです。あくまで真似。PHP5.3以降を使う方がいいです)

<?php
class A {
  static function hoge($class=__CLASS__) {
    var_dump($class);
  }
}

class B extends A {
  //派生クラスには以下のコードをコピペする
  static function hoge($class=__CLASS__) {
    return parent::hoge($class);
  }
}

class C extends B {
  //派生クラスには以下のコードをコピペする
  static function hoge($class=__CLASS__) {
    return parent::hoge($class);
  }
}

A::hoge(); //A
B::hoge(); //B
C::hoge(); //C

要はデフォルト引数を使って呼び出し元のクラスを伝播させてるのです。
コードの重複が発生していますが、コピペで済んでいるところがポイント。__CLASS__を使っていればこそです。