人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【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なのですか?

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

●質問者: PEPOTA
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:CentOS PHP print 環境
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● arcana
●12ポイント

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

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


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


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

◎質問者からの返答

ありがとうございます。


2 ● tobeoscontinue
●68ポイント ベストアンサー

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になる。と解釈するようにしてます。

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

◎質問者からの返答

よくわかりました。

ありがとうございます。


3 ● Mook
●8ポイント

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


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

PHP 型の比較表

◎質問者からの返答

ありがとうございます。


4 ● ワテ
●6ポイント

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

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

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

では無く

if(is_null($a)){

print "a";

}else{

print "b";

}

ではないでしょうか?

◎質問者からの返答

ありがとうございます。


5 ● hirose504
●6ポイント

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

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

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

if ($a === null) {}

または

if (is_null($a)) {}

を使うのが良いでしょう

◎質問者からの返答

ありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ