Home > info > 変数の評価

変数の評価

これは気づかないとかなりハマるし、アプリにバグを埋め込むことになります。

フォームから来た変数で 0 を値に持つ変数を空文字列かどうか評価したら空として認識してる気がしたのでテストコードを書いてみました。

以下のコードを実行

$i = 0;
print_r(’$i: ‘ . $i . “\n”);
print_r(’$i == null: ‘ . ($i == null) . “\n”);
print_r(’$i == false: ‘ . ($i == false) . “\n”);
print_r(’$i == “”: ‘ . ($i == “”) . “\n”);

以下が結果

$i: 0
$i == null: 1
$i == false: 1
$i == “”: 1

null の評価については今更何も言うまい。
確かに空文字列か評価したら true を返しています。0 という値が入ってるのに。最初に $i を integer として定義してるので型変換が起きてるのだろうと思って、型キャストして評価してみました。

コード

print_r(’(string) $i == “”: ‘ . ((string) $i == “”) . “\n”);

結果

(string) $i == “”:

一応期待した動作になりましたが Perl に慣れていると気持ち悪いです。
慣れるべきなのかも知れませんが、明らかに文字列として評価を試みてるのだから、そこでも型の自動変換をして欲しいものです。

今回は、フォームから来た時点では string でしたが、-= で減算処理をしていたため、その時点で integer に自動変換され、文字列的には空でないのに、”" オペランドを integer として評価したために、0 == “” が true になったもののと思われます。

自動型変換の演算子とオペランドの関係については、下記参照。
http://jp.php.net/manual/ja/language.types.type-juggling.php

常に厳密比較を使った方が楽かも知れません。
http://jp.php.net/manual/ja/types.comparisons.php

info ,

  1. コメントはまだありません。
  1. No trackbacks yet.