ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

2007年~2011年ごろまで はてなダイアリー に書いてた記事を引っ越してきました。

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の文法の制限内で、どうにか裏を掻き、抜け道を探る・・・。

で。

あった。一応。