読者です 読者をやめる 読者になる 読者になる

array_mapでstaticメソッドを呼び出す時に、selfが使えない

php

ここのところPHPばかりやっているので、小ネタ。


PHP 5.2.8 for Windows での話。

array_mapで関数名を指定する時、通常は文字列で指定する。

<?php
function _add3($a) {
  return $a + 3;
}
$array = array(1,2,3);
print_r(array_map('_add3', $array));

クラス内の関数の場合はarrayで指定する。

<?php
class Test {
  public function _add3($a) {
    return $a + 3;
  }
  public function hoge($array) {
    return array_map(array($this, '_add3'), $array);
  }
}
$test = new Test();
$array = array(1,2,3);
print_r($test->hoge($array));

インスタンスメソッドが$thisで指定できるなら、staticメソッドはselfでいける!と思ったら・・・

<?php
class Test {
  public static function _add3($a) {
    return $a + 3;
  }
  public function hoge($array) {
    return array_map(array(self, '_add3'), $array);
  }
}
$test = new Test();
$array = array(1,2,3);
print_r($test->hoge($array));

なぜかselfが定義されていない定数というNoticeが出る。

Notice: Use of undefined constant self - assumed 'self' in test.php on line 6

s/self/get_class($this)/
s/self/__CLASS__/

でNoticeは出なくなる。selfの実体は'self'という文字列なので、クラス名の文字列を渡す必要があるコールバック関数では使えないってことかしら。
まあ、E_STRICTを切ればいいんだけど・・・ねえ。

参考

静的なクラスメソッドの場合、 0 番目の要素としてオブジェクトを渡す代わりにクラス名を渡すことにより、 オブジェクトのインスタンスを作成せずに渡すことができます。