PHPでライブラリ(クラス)を読み込み、インスタンスを返す仕組みを上手いこと作るべく、ちょっと勉強してきました。

call_user_func_array のように任意の引数をコンストラクタに渡してインスタンスを作りたかったのですが、なんと call_user_func_array はコンストラクタを呼べないのです...。。

そこでググってみたところ、ReflectionClassなるものを発見しました。

PHP5から導入されたコアクラスのようなのですが、こいつが凄く便利でした!

PHP: クラス/オブジェクト - Manual


<?php
// インスタンスを返す関数
function get_instance($class_name)
{
    if (func_num_args() <= 1){
        return new $class_name;
    }else{
        // ここがReflectionClass!
        $args = func_get_args();
        array_shift($args);
        $reflection = new ReflectionClass($class_name);
        return $reflection->newInstanceArgs($args);
    }
}

// 適当なクラス
class Test {
    private $word = "";

    public function __construct($word)
    {
        $this->word = $word;
    }

    public function say()
    {
        print $this->word;
    }
}

get_instance("TEST", "ウニョラー!トッピロキー!キロキロー!!")->say();
?>
# 実行結果
ウニョラー!トッピロキー!キロキロー!!

メソッドチェーンがしたかった訳ではないのですが、ちょっと面白い事になりましたw
どんどんバージョンアップされ新しい機能が盛りだくさんのPHP、便利ですね。