【PHP】

環境-----
CentOs 4.2
PHP 4.3.9

質問-----
<?php

$a = null;

if($a == null && $a == 0){
print "a";
}else{
print "b";
}

?>

aが出力されます。

PHPでは、$aは、nullなのに、0なのですか?

※開発に詳しい人のみ答えてください。

回答の条件
  • 1人5回まで
  • 登録:2007/02/24 19:31:02
  • 終了:2007/03/01 17:01:00

ベストアンサー

id:tobeoscontinue No.2

tobeoscontinue回答回数214ベストアンサー獲得回数542007/02/24 21:58:55

ポイント68pt

phpの中で厄介というかまずい部分がこの比較だと思います。

他の言語と違う部分です。


比較する場合、左と右で型が違うものは比較できません。

が大抵の言語は自動変換する機能があり両方を同じ型にしてから比較します。

phpでは型の相互変換と言うようです。

http://jp.php.net/manual/ja/language.types.type-juggling.php


ところがこの相互変換の気が効き過ぎて戸惑ってしまうのです。

http://jp.php.net/manual/ja/types.comparisons.php

がphpがそうなのでしかたありません。

そのためより厳密に比較する===なるものが存在するわけです。


私はこれで痛い目にあってしまいました。


質問の解釈は

$a == nullの比較はnullとnullの比較なので型の変換はされずそのままTRUEです。

問題は$a == 0です。型の比較表を見ればTRUEなのですが、解釈としてこの場合どう考えればいいかです。私の場合、左と右を論理型に変換すると考えています。$aはnullなのでFALSEです。0もFALSEです。FALSEとFALSEを比較してTRUEになる。と解釈するようにしてます。

私流なので正しくないかもしれませんが。

id:keijiro

よくわかりました。

ありがとうございます。

2007/03/01 16:58:27

その他の回答(4件)

id:arcana No.1

arcana回答回数120ベストアンサー獲得回数102007/02/24 21:48:14

ポイント12pt

http://php.benscom.com/manual/ja/types.comparisons.php

詳しくは、「表 P.2. ==による緩やかな比較」をご参照ください。


== 比較での NULL と 0 は同義判定となっています。


どうしても NULL 判定を行いたい場合は、is_null を使用するのがベストと思います。

id:keijiro

ありがとうございます。

2007/03/01 16:58:12
id:tobeoscontinue No.2

tobeoscontinue回答回数214ベストアンサー獲得回数542007/02/24 21:58:55ここでベストアンサー

ポイント68pt

phpの中で厄介というかまずい部分がこの比較だと思います。

他の言語と違う部分です。


比較する場合、左と右で型が違うものは比較できません。

が大抵の言語は自動変換する機能があり両方を同じ型にしてから比較します。

phpでは型の相互変換と言うようです。

http://jp.php.net/manual/ja/language.types.type-juggling.php


ところがこの相互変換の気が効き過ぎて戸惑ってしまうのです。

http://jp.php.net/manual/ja/types.comparisons.php

がphpがそうなのでしかたありません。

そのためより厳密に比較する===なるものが存在するわけです。


私はこれで痛い目にあってしまいました。


質問の解釈は

$a == nullの比較はnullとnullの比較なので型の変換はされずそのままTRUEです。

問題は$a == 0です。型の比較表を見ればTRUEなのですが、解釈としてこの場合どう考えればいいかです。私の場合、左と右を論理型に変換すると考えています。$aはnullなのでFALSEです。0もFALSEです。FALSEとFALSEを比較してTRUEになる。と解釈するようにしてます。

私流なので正しくないかもしれませんが。

id:keijiro

よくわかりました。

ありがとうございます。

2007/03/01 16:58:27
id:Mook No.3

Mook回答回数1312ベストアンサー獲得回数3912007/02/24 22:00:06

ポイント8pt

PHP には緩やかな比較(演算子 ==)と厳密な比較(演算子===)があり、前者では0 と NULL が等価と判断されます。


詳細は下記のリンクにありますので、御参照ください。

PHP 型の比較表

id:keijiro

ありがとうございます。

2007/03/01 16:58:34
id:wate_wate No.4

ワテ回答回数45ベストアンサー獲得回数32007/02/25 01:16:50

ポイント6pt

少し質問の意図と外れるかも知れませんが

要はNULL判定についての質問であれば、

if($a == null && $a == 0){

では無く

if(is_null($a)){

print "a";

}else{

print "b";

}

ではないでしょうか?

id:keijiro

ありがとうございます。

2007/03/01 16:59:22
id:hirose504 No.5

hirose504回答回数5ベストアンサー獲得回数02007/02/26 17:04:48

ポイント6pt

http://www.php.net/manual/ja/language.operators.comparison.php

整数値を文字列と比較する際、文字列が 数値に変換されます。 数値形式の文字列を比較する場合、それは整数として比較されます。

$a が null かどうかを調べるには

if ($a === null) {}

または

if (is_null($a)) {}

を使うのが良いでしょう

id:keijiro

ありがとうございます。

2007/03/01 16:59:22

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません