Snow LeopardはPHP 5.3.0入り
自宅のMacをSnow Leopardにした。
いちばんびっくりしたこと:
icecube:~ hiro_y$ php -v PHP 5.3.0 (cli) (built: Jul 19 2009 00:34:29) Copyright (c) 1997-2009 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies
PHP 5.3.0がデフォルトで入ってる…。
PHPのオートローディングはis_callable関数でもきちんと働く
PHPのオートローディングで1つ気になることがあったので実験。
/test.php
<?php function __autoload($class) { $path = "classes/{$class}.php"; if (file_exists($path)) { include_once $path; } } var_dump(is_callable('Foo::execute')); var_dump(is_callable(array('Foo', 'execute'));
/classes/Foo.php
<?php class Foo { public static function execute() { echo 'Hello'; } }
この状態でtest.phpを実行。var_dumpでいずれもtrueが出力されることを確認しました。クラス実行時にオートローディングが働くことはわかっていましたが、is_callable関数でも働くかどうか不安だったので試してみたということで。
karintoの変更点とか
気が付けば長いこと書いてませんでしたが、karintoは結構変わりました。
- routing定義を明示的に書かなければならなくなった
- karinto::dispatch('/foo', 'myapp_foo'); とか
- routing定義で指定するのは関数に限らずcallback型ならOKになった
- 関数はもちろんOK
- 無名関数ももちろんOK
- array('Myapp_Foo', 'execute') とか 'Myapp_Foo::execute' とかクラスも使える
- オートローディング定義しておけば任意の場所のクラス実行とかできる
- 実行するcallbackの3番目の引数にkarinto_sessionのインスタンスが渡らなくなった
できるだけシンプルに、でもちょっと複雑なことをしたくなってもできるように。バランスって難しいですね。
無名関数はClosureのインスタンスになる
ようやくPHP 5.3.0の環境をWindows上に作ってみたんだけど、無名関数はPHP 5.3.0から追加されたClosureクラスのインスタンスになるみたい。
C:\>php -v PHP 5.3.0 (cli) (built: Jun 29 2009 21:25:23) Copyright (c) 1997-2009 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies with Xdebug v2.0.5, Copyright (c) 2002-2008, by Derick Rethans C:\>php -r "var_dump((function() {}));" object(Closure)#1 (0) { }
普通にcall_user_func関数で実行できたり、is_callable関数に渡すとtrueが返ってきたりする。特殊なcallback型という扱いなのかな。
routing定義とか面倒になった
そしてまたしても心変わり。実行する関数名をPATH_INFOから自動的に決定する仕様に戻しました。routing定義とか面倒くさいし、正規表現で定義とか複雑なことやりたくないし。
<?php require_once 'karinto.php'; karinto::run(); // GET / function get_(karinto_request $req, karinto_response $res) { $res->output('This is a test page.'); } // GET /foo function get_foo(karinto_request $req, karinto_response $res) { $res->message = 'Hello ' . $req->name; $res->render(); }
例えば、上のように2つの関数だけが定義されている場合、get_foo関数は
- /foo
- /foo/bar
- /foo/bar/baz
のようなURLでアクセスが来た場合に実行される関数になります。barとかbazとかはkarinto_request::url_paramメソッドで取得する感じ。
get_で関数名が始まるのが気持ち悪い人はkarinto::$function_prefixを設定しておけば関数名にプリフィクスが付けられますよ。
githubに引っ越しました
karintoですが、リポジトリの場所をGoogle Codeからgithubに移転しました。
その際に仕様を変更して、PATH_INFOから実行する関数名を自動的に決定する方式から、実行する関数名をあらかじめ定義しておかなくてはならないようにしました。
<?php require_once 'karinto.php'; karinto::route('/foo', 'myapp_foo'); karinto::run(); function myapp_foo(karinto_request $req, karinto_response $res) { $res->message = 'Hello ' . $req->name; $res->render(); }
ちなみに上の例だと、PHP 5.3から導入されるラムダ関数を使うともっとすっきり書けます。
<?php require_once 'karinto.php'; karinto::route('/foo', function(karinto_request $req, karinto_response $res) { $res->message = 'Hello ' . $req->name; $res->render('myapp_foo.php'); }); karinto::run();
ラムダ関数だけ今すぐ使えるとうれしいなぁ…。
# 名前空間はそれほど必要を感じてない