DynamicMTML で変数に入れた数字を文字列として扱いたい場合は mt:SetVarBlock を使った方が無難
2015-12-16
1分で読了
更新: 2025-12-14
目次
Movable Type の DynamicMTML 環境でのお話です。
例えば、
と変数にセットします。これを、PHP で文字列かどうか調べると、
ctx;
var_dump(is_string($ctx->__stash['vars']['foo']));
?>
結果は、
bool(true)
となり、文字列であることが分かります。
これを op モディファイアで 1 減らします。
ctx;
var_dump(is_string($ctx->__stash['vars']['foo']));
?>
結果は、
bool(false)
となり、数値になりました。mt:Var で op して setvar しても同様です。
ctx;
var_dump(is_string($ctx->__stash['vars']['foo']));
?>
大抵はこれでも問題ないでしょうが、もしこの foo 変数を渡した先の PHP のコードの中で is_string や ctype_digit を使って値を判定していると、思った動作にならない可能性があります。
その場合は、下記のようにして mt:SetVarBlock すれば文字列となります。
ctx;
var_dump(is_string($ctx->__stash['vars']['foo']));
?>
実際には、コードを見ないとこのあたりの挙動はわからないので、実装の方で ctype_digit を is_numeric に切り替えるなどするのがいいかもしれませんが、op モディファイアを使って演算したときの豆知識として知っておくと良いと思いました。
以上です。