トップ 一覧 検索 ヘルプ RSS ログイン

変数_PHPの変更点

+!!!変数
+
+変数について、Tips的なことを別ページに書いておきます。
+
+!!型も含めた比較
+
+PHPではちょっと変数の扱いに特殊な部分があります。
+例えば、「null」の扱いとして
+
+ $val = null;
+ if($val == null) print("valはnullです。<br>\n");
+ if($val == '')   print("valは空文字です。<br>\n");
+ if($val == 0)    print("valは0です。<br>\n");
+これはどう出力されるでしょうか?
+実は予想に反して、以下のように出力されてしまいます。
+ valはnullです。
+ valは空文字です。
+ valは0です。
+
+「null = '' = 0」???と思ってしまいますよね。
+これは「==」がくせ者で、型を比較対象にしていない、というのが原因のようです。
+正確な比較のようで、あいまいな比較をしているようで。
+正確に比較する場合(型も比較対象に入れる場合)は以下のようにします。
+
+ $val = null;
+ if($val === null) print("valはnullです。<br>\n");
+ if($val === '')   print("valは空文字です。<br>\n");
+ if($val === 0)    print("valは0です。<br>\n");
+
+「===」を使って比較します。これの出力結果は
+ valはnullです。
+となり、目的の比較が行われています。
+
+同様に、以下も引っかかります。
+ $val = "0123";
+ if($val == 123) print("valは123です。<br>\n");
+
+「==」を使うと文字列と数値の比較が行われ、内部的に数値に変換できるものが
+自動で変換されて
+ if(123 == 123) print("valは123です。<br>\n");
+となってしまうようです。
+
+ if($val == strval(123)) print("valは123です。<br>\n");
+のように無理矢理文字列に変換したとしても、この結果はtrueとなります。
+(比較としては「if("0123" == "123") 」ではあるんですけどね)
+
+解決策として、以下だと正常にfalseになります。
+ if($val === 123) print("valは123です。<br>\n");
+
+よくはまる例ですが、
+
+ $id = 0;
+ if($id == '')   print("値が指定されていません。<br>");
+ if($id == null) print("値が指定されていません。<br>");
+
+は、if文がtrueになりますので、たとえ0が値として入っていても
+「値が指定されていません。」となってしまいます。「===」で比較しないといけません。
+
+ $id = 0;
+ if($id === '')   print("値が指定されていません。<br>");
+ if($id === null) print("値が指定されていません。<br>");
+
+!!変数をクリアする
+
+変数を完全に破棄するには、nullを入れるのではなく「unset」を使います。
+
+ $val = "test";
+ print("[".$val."]<br>\n");
+ unset($val);
+ print("[".$val."]<br>\n");
+
+「unset($val)」にて変数$valを解放しています。
+変数をそのまま放置していては貯まる一方ですので(といっても、関数から離れたりページが変わるときにはクリアされますが、セッション変数は例外的に残ります)
+使い終わったローカル以外の変数は明示的に破棄してあげたほうがいいかもしれません。