逆引きrhaco(?)6: 無名関数(もどき)を作る

PHPでは無名関数をつくれないのですが、それっぽいものをrhacoではつくることが出来ます。(rhaco 1.3.1以降)。

(追記)実際は無名関数ではなく、無名っぽくするために、ランダムにクラス名を決める、ランダム名クラスになります。

例えばJavascript

ret = function(x){return x++;}
alert(ret(3));// = 3

というのを

Rhaco::import('lang.Variable');
$return = Variable::anonym(array("alert","x","return x++;"));
echo $return->alert(3);// = 3

と書けます。引数が複数欲しい場合は

$return = Variable::anonym(array("alert","x,y","return x+y;"));
echo $return->alert(3,1);// = 4

プロパティを指定したい場合は

$return = Variable::anonym("hoge","fuga",array("alert","x","$this->hoge=x;$this->fuga=x-1;"));
$return->alert(3);
echo $return->hoge;// = 3
echo $return->fuga;// = 2

プロパティは2つを例としましたが、何個でも指定可能です。
Javascriptより直感的ではないですが、これを使うことで、手軽に関数を書くことが出来ます。後日書く予定のmixinでメソッドを追加するのも簡単にできます。

逆引きrhaco(?)5: ファイルの読み書き

rhacoでファイルを読み書きする場合はio.FileUtilを使用します。

Rhaco::import('io.FileUtil');
//読み込み
$filer = new FileUtil();
$sentence = $filer->read('/path/To/readfile','EUC-JP');
...
//書き込み
$filer->write('/path/To/writefile',$sentence,'EUC-JP');
$addsentence = 'rhaco is ht++';
//追加
$filer->append('/path/To/writefile',$addsentence,'EUC-JP');
FileUtil::read();

みたいな使いかたは出来ません。

(2007/10/19追記)
静的呼び出ししたい場合はファイルが存在するという前提で、

Rhaco::import('io.model.File');//Rhaco::import('io.FileUtil');でも使用可能になります。
$sentence = File::read('/path/To/readfile');

で読み出せます。エンコードは指定できないですがー。
(追記ここまで)
メソッドの第3引数は省略可能です。指定しなければ元のエンコードのままです。
FileUtilは良く使うのでFというショートカットが用意されてます。

Rhaco::import('io.F');

で使用できます。
他にもFileUtilにはファイルを操作するために色々なメソッドがあります。少しずつ載せていこうと思います。

(最新の記事はrhacoアプリ開発日誌で見ることが出来ます。)

逆引きrhaco(?)4: Atomフィードを取得したい

前回はFeedが強制的にRSS2.0形式になっていたので、Atom1.0形式をそのまま読み込みたい場合。

Rhaco::import('tag.feed.Atom10');
Rhaco::import('network.http.Http');
$feed = new Atom10();
$feed->set(Http::body('http://url/To/atom'));

こんな感じ。FeedParserと違って、URLを引数に取れないので、Httpクラスを使ってソースをGETし、それを引数とします。他にAtom0.3(Atom03), RSS0.9(Rss09), RSS1.0(Rss10)形式が使用できます。

逆引きrhaco(?)3: Feedを取得する

一番簡単な方法は

Rhaco::import('tag.feed.FeedParser');
$feed = FeedParser::read('http://url/To/feed');

です。注意点は

○必ずRSS2.0形式になること
○RSS2.0形式で通常使われる項目(channel項目としてtitle,link,description,image,cloud,textinput、item項目としてtitle,link,description,author,guid,source,comments,pubdate,enclosure,category)以外は取得されないこと。(例えばdc:subjectなどの項目は取得できません。)
○RSS2.0形式の制限があること。(例えばitemのlink項目は複数取得できません)

です。

channel無しでitemのみ必要な場合は

$items = FeedParser::getItem('http://url/To/feed');

[便利な機能]
http://url/To/feedの代わりにhttp://url/To/htmlとすると、指定したHTMLファイル内にがある場合、その中にあるフィードを読み込んでくれます。

逆引きrhaco(?)2: グローバル変数を設定したい

グローバル変数を設定したい場合はphp.iniでregister_globals = Onなんてしないで

Rhaco::setVariable('変数名','値');

とすると値が設定されます。値を取り出す時は

$variable = Rhaco::getVariable('変数名');

でOKです。