2010-03-08

namespaceつきのPHP extensionをつくる

仕様についてはともかく、php 5.3 からnamespaceが使えるようになりました。
今のところPHPのソースに標準でついてるエクステンションでnamespaceを使っているものは無いようだったのでちょっと試してみました。


通常のnamespaceなしの場合との違いは一カ所だけです
zend_function_entry msgpack_functions[] = {
//    PHP_FE(hoge, NULL)  /* 通常の場合 */
    ZEND_NS_FE("myspace", hoge, NULL)
    {NULL, NULL, NULL}  /* Must be the last line in msgpack_functions[] */
};

PHP_FEの代わりにZEND_NS_FEを使うだけです。
他はそのままでOKです。

ソースファイル
PHP_FUNCTION(hoge)
{
    RETVAL_STRINGL("hoge", 5, 1);
}

ヘッダファイル
PHP_FUNCTION(hoge);


サンプル
<?php
print myspace\hoge();PHP_FUNCTION(hoge);

実行結果
$ php sample.php
hoge

ざっと見たところ、今のところエクステンションでクラスをnamespaceに入れるインターフェースは用意されてないようです。(自分でマクロを書けばできなくはなさそう)
また、一つのエクステンション内でnamespaceは複数つかえますが、namespaceが別でも同名の関数を定義するのは普通の方法では難しそうです。

ZenBackWidget