ホーム

スタッフブログ

2009年8月4日

PHPでの「0」の意味

久々の投稿になってしまいました、
最近プログラミングエンジニア道まっしぐらのTです。

ここのところPHPとMySQLでのシステム構築にいそしんでいるのですが、
その中で気がついたことをメモしておきます。

いままで大学でC言語とか趣味でAS3などいじっていましたが、
PHPを本格的に触るのは入社してからのこと。
以前から「PHPは変数の”型”に関してかなりゆるい」というイメージは持っていて
実際、変数宣言(それに伴う型の指定も!)をしないという仕様に驚きつつ「楽だなー」と感じてました。

ところがある時、空文字の「””」と数値の「0」が同じ挙動をしているような節に気がつき、
簡単なスクリプトを書き実験してみることにしました。

結果、数値の「1」と空文字の大きさを比較したところ、

空文字<1

という出力結果に。
PHPに詳しい人にとっては当たり前の結果かもしれませんが
これにはびっくり。普通に考えたらそもそも文字型と数値型の大きさ比べれば即エラー!って気がしますが、
「型に関しておおらか」なPHPでは数値と大きさを比べると、空文字を勝手に0として判断しちゃうのでしょうか。

ちなみに空文字と0が等しいかどうかもチェックしてみると、

空文字==0 は「真」である!

と判定されてしまいました。
この等しくなってしまうというのは結構いろんなところで言及されてるようです。(PHPの問題点として)
もちろん、型まで等しいかどうかのチェックをすると

空文字===0 は「偽」である!

と期待通りの判定。
きちんと型まで等しいかどうかのチェックには「=」3個が必要ですね。

以下がテスト用に作ったサンプルスクリプトです。

<?php
$a="";
echo <<<EOF
<h2>\$a="" と 1 の大きさ比較</h2>
EOF;
if(a<1){
echo "空白は1より小さい<br>";
}else{
echo "空白は1より大きい<br>";
}
echo <<<EOF
<h2>\$a="" は 0 と同じか</h2>
<h3>a==0のとき</h3>
EOF;
if(a==0){
echo "空白は0と同じ。a==0は真<br>";
}else{
echo "空白は0と同じでない。a==0は偽<br>";
}
echo <<<EOF
<h3>a===0のとき</h3>
EOF;
if(a===0){
echo "空白は0と同じ。a===0は真<br>";
}else{
echo "空白は0と同じでない。a===0は偽<br>";
}
?>

そしてこれが出力結果です。

—————
$a=”” と 1 の大きさ比較
空白は1より小さい

$a=”” は 0 と同じか

a==0のとき
空白は0と同じ。a==0は真

a===0のとき
空白は0と同じでない。a===0は偽

—————

求人バナー

このページの上部へ戻る