[PHP:Smarty]変なトコで落とし穴。条件文に定数使用するとき。

Smartyで思わず変なトコで引っかかったのでメモ。

テンプレ内で$smarty.const.XXXでPHPでdefineした定数にアクセスできるのはお約束として、

{if $hoge == $smarty.const.DEFINED_VALUE}
{/if}

みたいな条件判定をさせようとしたら、
どう考えても一致しないケースでもなぜか条件クリアしてしまう。

テンプレートキャッシュの中身をみたら
上記の文が

_tpl_vars[‘hoge’] == defined(‘DEFINED_VALUE’) ? DEFINED_VALUE : null ): ?>

とパースされてる。

これはこれでいいんじゃねー?と思ったが
念の為PHP側で一回テストしたらこれがなぜかアウト。

ex. if ($hoge == defined(‘DEFINED_VALUE’) ? DEFINED_VALUE : null ):

hogeに”HOGEHOGE”、define(DEFINE_VALUE,’DEFINE’)
みたいになっててもif文判定クリアしちゃう。
echo defined(‘DEFINED_VALUE’) ? DEFINED_VALUE : null;
ってすると、当然のように設定した文言”DEFINE”が表示。

PHPエンジン側の解釈のタイミング?みたいなので下記のようにする事で一応クリア。

{if $hoge == ($smarty.const.DEFINED_VALUE)}

あわせて、上記PHP側の例の場合

ex. if ($hoge == defined(‘DEFINED_VALUE’) ? DEFINED_VALUE : null ):

これも

ex. if ($hoge == (defined(‘DEFINED_VALUE’) ? DEFINED_VALUE : null) ):

って三項演算子の箇所を括ってやればOKだった。

ちょっと釈然としない気もするけど・・・一応メモ。

Leave a Comment

メールアドレスが公開されることはありません。