web-dev-qa-db-ja.com

PHP nullはゼロに等しいと見なします

Phpでは、($myvariable==0) $ myvariableがゼロの場合、式の値はtrueです。 $ myvariableがnullの場合、この式の値もtrueです。 2番目のケースを除外するにはどうすればよいですか?つまり、$ myvariableがゼロの場合にのみ式をtrueにしたいということです。もちろん書くことができます

($myvariable!=null && $myvariable==0 )

しかし、これを行う他のエレガントな方法はありますか?

53
Steven
$myvariable === 0

比較演算子 の詳細をお読みください。

85
SilentGhost

あなたは深い質問をほのめかします:表現はいつ真実である必要がありますか?

以下では、なぜ何をしているのが機能しないのか、howそれを修正します。

多くの言語null0、および空の文字列("")はすべてfalseと評価されるため、ifステートメントは非常に簡潔で直感的になりますが、null0、および""もすべて異なるタイプです。それらはどのように比較されるべきですか?

このページ は、2つの変数が比較されている場合、変数は次のように変換されることを示しています(最初の一致でテーブルを終了します)

Type of First  Type of Second   Then
null/string    string           Convert NULL to "", numerical/lexical comparison
bool/null      anything         Convert to bool, FALSE < TRUE

したがって、nullと数値を比較しています。したがって、nullと数値の両方がブール値に変換されます。 このページ は、そのような変換ではnull0の両方がFALSEと見なされることを示しています。

これで、式はfalse==falseになります。これはもちろん正しいことです。

しかし、あなたが望むものではありません。

このページ は、PHPの比較演算子のリストを提供します。

Example   Name                Result
$a ==  $b  Equal              TRUE if $a equals $b after type juggling.
$a === $b  Identical          TRUE if $a equals $b, AND they are of the same type.
$a !=  $b  Not equal          TRUE if $a not equals $b after type juggling.
$a <>  $b  Not equal          TRUE if $a not equals $b after type juggling.
$a !== $b  Not identical      TRUE if $a not equals $b, or they are not of the same type.
$a  <  $b  Less than          TRUE if $a is strictly less than $b.
$a  >  $b  Greater than       TRUE if $a is strictly greater than $b.
$a <=  $b  Less than/equal    TRUE if $a is less than or equal to $b.
$a >=  $b  Greater than/equal TRUE if $a is greater than or equal to $b.

最初のコンパレータは、現在使用している比較です。前述の変換を実行することに注意してください。

2番目のコンパレータを使用すると、問題が修正されます。 nullと数値は同じ型ではないため、===演算子のように型変換を実行するのではなく、==比較はfalseを返します。

お役に立てれば。

12
Richard

ヌルまたはゼロとして識別するには:

  • is_int($var)変数が数値または数値文字列の場合。ゼロを識別するには、is_numeric($var)を使用するか、または_$var === 0_を使用します。

  • is_null($var)変数がNULLの場合

6
Pao Im

Php関数 is_null() 関数と===演算子。 !==も期待どおりに機能します。

4
Salman A

($myvariable === 0)これは、型強制を実行しません。

3
Skilldrick

ゼロが文字列である可能性がある場合は、「ゼロ文字列」のチェックも検討する必要があります

($myvariable === 0 || $myvariable === '0')
1
Thermech

2番目の解決策も機能しません。 === operator は、問題の解決策です。

1
soulmerge
$myvariable===0


$a === $b 

$ aが$ bと等しく、それらが同じタイプである場合、同一のTRUE

0
Haim Evgi

is_null 関数ですが、これは単に$myvariable!=null

0
Soufiane Hassou

私のプロジェクトの1つで同様の問題に直面していましたが、条件の有効な値としてZEROの値も使用していたというわずかな違いがありました。 NULLをゼロやその他の値から分離する単純なロジックを使用して、どのように解決したかを示します。

    if (gettype($company_id) === 'NULL') {
        $company = Company::where('id', Auth::user()->company_id)->first();
    } else {
        $company = Company::where('id', $company_id)->first();
    }
0