call_user_func_arrayとparent

可変長引数のメソッドがあって、それをオーバーライドしつつ親クラスの同メソッドを呼び出したかったんだけど、一瞬どうやればよいのか迷ったのでメモ。

<?php

class Foo {
    public function hoge() {
        $args = func_get_args();
        return implode(',', $args);
    }
}

class Bar extends Foo {
    public function hoge() {
        $args = func_get_args();
        $result = call_user_func_array(array($this, 'parent::hoge'), $args);
        return strrev($result);
    }
}

$foo = new Foo();
echo $foo->hoge(1,3,5) . "\n";

$bar = new Bar();
echo $bar->hoge(1,3,5) . "\n";

?>
1,3,5
5,3,1

こんな感じ。機能は適当にでっちあげた。


ちなみに下記のやりかたはスタティックメソッドの呼び出しのはずなんだけど、E_STRICTが設定されてない場合はインスタンスへのアクセスになるっぽい。メンバ変数にもアクセスできるし、var_dump($this)とかするとよくわかる。
で、E_STRICTがつくとFoo::hogeはstaticに呼べねーよ、とエラーになる*1。よくわからんなぁ。

        $result = call_user_func_array(array('parent', 'hoge'), $args);

まぁ、これじゃどう見てもインスタンスに見えないし、ちゃんと使い分けるべきだな。

*1:もちろんstaticなメソッドならOK