◆ 自分でもよくわからないものになりました
◆ ムリに組み合わせなければよかったです
◆ 使える情報と思わずネタとして読んでください 

前回 PHPでプロトタイプチェーンさせるという謎を記事を書きましたね
今回はこれをさらにパワーアップさせてみました
http://var.blog.jp/archives/47102565.html


残りの記事にする予定リストを眺めていたら 前に作ったPHPをJavaScriptぽくするライブラリ? を発見したのでそれにプロトタイプチェーンの機能を混ぜてみました
結果 もう自分でもどうなってるのかよくわからないことになってきました

前に作っていたのは JavaScript と同じメソッド名でのメソッドチェーンをする機能です
それぞれの型に対して 専用のオブジェクトでラップします
ラップされていると JavaScript と同じ名前で同じような動きができるメソッドが使えます
underscore.js や lo-dash の「_」でラップしてメソッドチェーンするのに近いです
遅延評価はしませんけど

このライブラリに 前回のプロトタイプチェーンを無理矢理しかもかなり大雑把に追加しました
それぞれ別だと まだわかりやすい感じだったのですが 混ぜたことで自分でもどうなってるのコレ?と思えるものになっています
深く考えるのがつかれたので とりあえず動いてるようなので コレで良しとします
使う予定も 今後の更新もないので別にいいでしょう


コード量が多いので見たい場合はリンク先をどうぞ
http://var.blog.jp/t/lib/js.php

JavaScript と同じメソッド名と書きましたけど 一部違ったり 独自のメソッドが山のように追加されていたり 予約語の都合で別の名前になっていたりで JavaScript そのままってわけじゃないので注意です



一応 使い方を書いておきます

変数は全部 _ 関数を通します
$arr = _([1,2,3]);
$str = _("a,b,c,d");
あとはメソッドチェーンするだけです

基本的に返り値は _ ラップされたものです
中身が欲しければ raw メソッドを実行します
文字列化のtoStringや長さのlengthでは _ ラップされていないものが返ってきます
_ ラップされた配列や文字列を関数として実行すると n番目の値を取ってこれます
var_dump(
$arr->length,
$arr->raw(),
$arr->join("-")->raw(),
$arr->join("")->substr(1, 2)->repeat(3)->raw(),
$arr(0)->raw(),
$str(0)->raw()
);
int(3)
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
string(5) "1-2-3"
string(6) "232323"
int(1)
string(1) "a"

プロトタイプチェーンもできるようになってます
1つめは Array.prototype
2つめは Object.prototype
3つめは Object.prototypeの先なのでNULL
となります
var_dump(
$arr->__proto__,
$arr->__proto__->__proto__,
$arr->__proto__->__proto__->__proto__,
);
object(__C__)#167 (2) {
["data":protected]=>
NULL
["__proto__"]=>
object(__C__)#168 (3) {
["data":protected]=>
NULL
["__proto__"]=>
NULL
["toString"]=>
object(Closure)#169 (1) {
["parameter"]=>
array(1) {
["$This"]=>
string(10) "<required>"
}
}
}
}
object(__C__)#168 (3) {
["data":protected]=>
NULL
["__proto__"]=>
NULL
["toString"]=>
object(Closure)#169 (1) {
["parameter"]=>
array(1) {
["$This"]=>
string(10) "<required>"
}
}
}
NULL

プロトタイプチェーンにしてるので メソッド追加ができます
数値型に plus1 メソッドを追加します
var_dump($arr(0)->raw());
try{
var_dump($arr(0)->plus(1)->raw());
}catch(Exception $e){
var_dump("error");
}

// extend prototype
__N__::$prototype->plus = function($This, $plus){
return _($This->raw() + $plus);
}

var_dump($arr(0)->plus(1)->raw());
int(1)
string(5) "error"
int(2)

ムリヤリ JavaScript みたいなことをできるようにしてるので 使いづらいのはしかたのないことです
それと 全変数を _ ラップ前提なのに 引数には _ ラップされてない変数じゃないとダメだったり 一部関数が多分動きおかしかったりと色々問題もあります


現在 PHPのJavaScript化計画はここまでです