memo/20111128
created 2011-11-28 modified 2011-11-28
ふむ、php5では変数にクラス名を代入して、その変数を指定してオブジェクトを作成できることが、仕様として明確になったようだ。
$name = "MyClassName"; $obj = new $MyClassName();
以前調べたとき、php4ではマニュアルに「動作未定義」と書かれているものの、ちゃんと動く、という状態だったと記憶していたのだが、いま調べたらphp4のマニュアルには"ユーザ記述"として、できるよ、と書いてあった。
リンク | 備考 |
---|---|
http://www.php.net/manual/ja/language.oop5.basic.php | PHP5 |
http://www.php.net/manual/ja/keyword.class.php | PHP4 |
話題飛ぶが、phpでコールバックイベントループを実装できるか試してみた。単に登録してコールバック起動するだけはできた。
コールバックを起動するには、
call_user_func(array($オブジェクト, $メソッド名文字列) 【,$パラメータ1【,...】】);でいけるようだ。
リンク | |
---|---|
http://php.net/manual/ja/function.call-user-func.php | PHP5 |
イベントのリストは、単にarrayを使ってやればよくて、
//イベントリストの初期化はグローバルで $gイベントリスト = array();
//イベント構造体をこんな風に定義して class イベント { var $時刻_; var $オブジェクト_; var $メソッド名_; function __construct($時刻, $オブジェクト, $メソッド名) { $this->時刻_ = $時刻; $this->オブジェクト_ = $オブジェクト; $this->メソッド名_ = $メソッド名; } }
//登録するときは ... global $gイベントリスト; array_push($gイベントリスト, new イベント(0, $オブジェクト, $メソッド名));
//取り出しと実行 ループ は ... global $gイベントリスト; while (count($gイベントリスト) > 0) { $先頭 = array_shift($gイベントリスト); call_user_func(array($先頭->オブジェクト_, $先頭->メソッド名_)); //引数なし $先頭 = null; }こんな感じでいけた。
あとは
$gイベントリスト はグローバルで大丈夫か検討しよう。
タイマイベント のウェイトどうしようかな。
ただし基本、phpって1コール1応答モデルだから...意味無いのかな。もし、クライアントに応答を先に返して、サーバ側は内部処理を続ける、ってなことをやるにはいいかもだけど。
セッションオブジェクト上にイベントリストを持てば?と思ったけど、そうすると多重呼びの管理をしないといけない。
うーむ。
さらに話題飛ぶが、phpでは日本語識別子(UTF-8)が普通に動くようだ。