SSブログ

文字列から関数やクラスを得る [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 メソッドを呼んで…みたいなあまり見慣れないことをやっていた。


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。