Help us understand the problem. What is going on with this article?

PHP5.2で遅延静的束縛

More than 3 years have passed since last update.

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

Hiraku
PHP, Go界隈をうろうろしています。最近はgRPCと戦ってる。 特に明示していなければ、記事中のソースコード片は `CC-0 1.0` とします。出典表示無しで自由にコピペして頂いて構いません。 ただ、記事自体をコピペされるのは嫌なので、ソースコード部分以外の文章は通常通り全ての著作権を私が保持するものとします。 引用を超える範囲のコピペは止めて下さい。
http://blog.tojiru.net/
mercari
フリマアプリ「メルカリ」を、グローバルで開発しています。
https://tech.mercari.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした