karintoはLuneになりました

作っていたフレームワークkarintoの名前を変更、Luneにしました。三日月みたいなフレームワークリポジトリとかはいつものgithubです。

できることはkarintoと変わりません。実装サンプルとか見ていただければいいかなと。

変更点としては、メソッド名とか変数名の命名規則がCamelCaseになったことぐらい。Zend Frameworkとか見ていてCamelCaseでいいかな、という気がしてきた感じです。PHPの関数と命名規則が揃わないのが見ていてあれですが。

そうそう、Luneになって1つよかったこと。クラス名が短くなった。

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を設定しておけば関数名にプリフィクスが付けられますよ。

karintoは面倒なことが嫌いな人向けのminimalなフレームワークを目指します。

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();

ラムダ関数だけ今すぐ使えるとうれしいなぁ…。
# 名前空間はそれほど必要を感じてない