[PHP] 文字列中の波括弧記法が気持ち悪すぎる
- 2008-09-18
- カテゴリ: Server Side
- タグ: PHP Tips
PHPでは、二重引用符 (") で括った文字列の中で、波括弧 ({}) を使って変数を展開できたりするわけだが、この波括弧記法があまりにも強力すぎて気持ち悪かったので書いてみる。
↓まずは普通の使い方。これは普通に便利。
echo "{$var} {$arr[0]} {$arr['key']} {$obj->name}";
↓メソッドを呼び出したパターン。ちょっと気持ち悪いけど便利。
echo "{$obj->getName()} {$obj->getCategory('all')}";
↓普通に式を埋め込めるのをいいことに、代入したり、グローバル関数を呼んでみたりした例。期待通りに動くが、だいぶ気持ち悪くなってきた。
echo "{$arr[$i = 1]} {$obj->{fn()}} {$obj->method((0 + 1) * 10 < time())}";
↓極めつけ。二重引用符を含めたパターン。これでも動く。最後の例とか、もはや何がなんだか。
echo "{$arr["key"]} {$obj->{"prefix_{$obj->method("{$arr[0]}")}_postfix"}[0]}";
何でこんなに柔軟なの?
と思って、PHPの処理系のソースを覗いてみて納得。どうやら、二重引用符中で {$ っていうトークンを見つけると、文字列としてのパースを終了して、スクリプトとしてのパースを開始するような仕様になっているみたい。だから、 {$ ... } で括られている中身は普通のPHPコードと同じ扱い。
うーむ、気持ち悪すぎる...
豆知識
波括弧記法の中は、PHPコードと同じように処理されるので、↓のコードはE_Noticeレベルのエラーが発生します。
echo "{$arr[key]}";
↓のように書けば、E_Noticeレベルのエラーは回避できます。
echo "$arr[key]";
echo "{$arr['key']}";
これも仕様としてはなかなか気持ちが悪い。
トラックバックURL
- http://liosk.blog103.fc2.com/tb.php/146-4625357d

