flat7th

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.phpPHP5
http://www.php.net/manual/ja/keyword.class.phpPHP4



話題飛ぶが、phpでコールバックイベントループを実装できるか試してみた。単に登録してコールバック起動するだけはできた。
コールバックを起動するには、
call_user_func(array($オブジェクト, $メソッド名文字列) 【,$パラメータ1【,...】】);
でいけるようだ。

リンク
http://php.net/manual/ja/function.call-user-func.phpPHP5

イベントのリストは、単に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)が普通に動くようだ。