LoginSignup
3

More than 5 years have passed since last update.

posted at

updated at

Organization

PHP5.2で遅延静的束縛

__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__を使っていればこそです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3