eval()/create_function()が使いづらい理由
非常に単純で、コードをべた書きできないからだと思う。文字列として渡さなければならないので、$ や " や ' を一々丁寧にエスケープしないとならないのが非常に、面倒くさい。
Perlであれば、
eval { my $i = 0; ... }; die $@ if $@;
みたく書けるし、また、無名サブルーチン/関数も
my $lambda = sub() { my ($a, $b, $c) = @_; ... $a + $b; };
と書ける。
PHPの本体側で処置できないのか?
少なくとも、無名関数をより実装しやすくする為の試みは php-internals のMLでも議論がされているようである。
[PHP-DEV] PATCH: anonymous functions in PHP
http://marc.info/?l=php-internals&m=117426121911550&w=2
2007年の3月一杯かけてMLのスレッドが流れていて、3月24日で止まっている。「テストを書けば取り込まれるかも」「PHP5.3になる?」とかあるが、後半はどうもクロージャの実装とかも絡み出していて、どうも放置されたっぽい。
Do You PHP はてな : PHP 5.3 Suggested Feature List
http://d.hatena.ne.jp/shimooka/20070910/1189359199
にも挙げられていない。・・・多分、忘れ去られてる。
玉砕覚悟でPHP5.2.xのソースに当たってみたが、案の定砕け散った。yaccとかLexパーサとかが入り乱れ、更にZTSのマクロに目を眩まされ、訳わからねぇ・・・。
理想は・・・
こんな感じだろう。当然。
$lambda = function($a, $b) { return $a + $b; }
ところが現実は
$lambda = create_function('$a, $b', 'return $a + $b;');
となる。一箇所でもエスケープし忘れたらアウト。'の代わりに"を使った日には地獄を見ること必定。
ヒアドキュメントも目的を達しない。
<?php $str1 = <<<HOGE This is here documents. val1 = \$val1. str1 = ...? : "$str1' HOGE; echo $str1; ?> 実行結果: This is here documents. val1 = $val1. ← やっぱり、$はエスケープしないとN.G. str1 = ...? : "' ← $str1 の中で $str1を展開しているからおかしくなっている?
ではどうするか?エスケープメントを忘れることができれば何だって良い。それが最優先だ。
PHPのソースコード自体に手を加えることは自分の技量では不可能。ではどうする?PHPの文法の制限内で、どうにか裏を掻き、抜け道を探る・・・。
で。
あった。一応。