文字列から関数やクラスを得る [PHP]
PHPのちょっと面白い言語機能として、変数の中に関数名やクラス名を入れておくと $ をつけて該当する関数やクラスに代替できるというものがある。
<?php
function fun () {
print("fun() called\n");
}
class Klass {
public function __construct() {
print("Klass created\n");
}
}
$funname = "fun";
$classname = "Klass";
$funname(); // -> fun() called
new $classname; // -> Klass created
?>
もっとも $"fun"()
とか new $"Klass"
とか書くことはできない。
これの使い道として思いつくのは、例えば abstract class DbAgent { ... }
とそれを継承した class MySQLAgent extends DbAgent{ ... }
と class SQLiteAgent extends DbAgent{ ... }
があったとして、MySQLを使う場合には設定ファイルに "MySQLAgent" と書き、SQLite を使う場合には "SQLiteAgent" と書く。一方でプログラム側では設定値を $dba
変数に入れておいて new $dba
とする、みたいなことができる。なかなか便利。
Java の Apache log4j ライブラリでもログの切り替えポリシーに対応するクラス名を log4j.properties に書いていたりするけど、ちょっとソースを追ってみたらあれは ClassLoader でクラスを作って Class クラスのオブジェクトの newInstance メソッドを呼んで…みたいなあまり見慣れないことをやっていた。
コメント 0