web-dev-qa-db-ja.com

PHPのNull対False対0

優秀な開発者は、NullFalse0および他のすべての「何もない」エンティティの違いを見つけて利用できると言われています。
is違い、特にPHPでの違いは? ===と関係がありますか?

139
stalepretzel

言語固有ですが、PHPで:

Nullは「nothing」を意味します。 varは初期化されていません。

Falseは「ブールコンテキストではtrueではない」を意味します。論理的な問題に対処していることを明示的に示すために使用されます。

0intです。数学に使用される上記の残りの部分とは関係ありません。

さて、トリッキーなのは、PHPのような動的言語では、すべてがブールコンテキストの値を持っていることです(PHPではFalse) 。

==でテストすると、ブール値がテストされるため、同等になります。 ===でテストすると、タイプがテストされ、不平等が生じます。

それで、なぜ彼らは役に立つのですか?

さて、strrpos()関数を見てください。何も見つからなかった場合はFalseを返しますが、文字列の先頭で何かを見つけた場合は0を返します。

<?php
// pitfall :
if (strrpos("Hello World", "Hello")) { 
    // never exectuted
}

// smart move :
if (strrpos("Hello World", "Hello") !== False) {
    // that works !
}
?>

そしてもちろん、状態を扱う場合:

DebugMode = False(オフに設定)、DebugMode = True(オンに設定)、およびDebugMode = Null(まったく設定しないと、ハードデバッグにつながります;-))を区別したい場合。

209
e-satis

nullnullです。 falsefalseです。悲しいですが本当。

pHPには一貫性があまりありません。開発者TRY nullを作成すると、「不明」または「存在しない」ことを意味します。しかし、多くの場合、Falseは「存在しない」として機能します(たとえば、strrpos( 'fail'、 'search')はnullではなくfalseを返します)

何かに対して既にfalseを使用している場合、nullが使用されていることがよくあります。例えばfilter_input()。変数がフィルターに失敗すると、falseを返します。変数が存在しない場合はnull(存在しないということは、フィルターも失敗したということですか?

phpには、関数でデータを返すという便利な機能があります。また、開発者はデータではなく、あらゆる種類の障害ステータスを詰め込んでいます。

PHPには、失敗(false、null)からデータ(int、strなど)を検出するための健全な方法はありません。

関数に応じて、=== nullまたは=== falseを常にテストする必要があります。またはその両方、filter_input()/ filter_var()などの場合

そして、ここで型ジャグリングのいくつかの楽しみがあります。配列やオブジェクトも含めません。

var_dump( 0<0 );        #bool(false)
var_dump( 1<0 );        #bool(false)
var_dump( -1<0 );       #bool(true)
var_dump( false<0 );    #bool(false)
var_dump( null<0 );     #bool(false)
var_dump( ''<0 );       #bool(false)
var_dump( 'a'<0 );      #bool(false)
echo "\n";
var_dump( !0 );        #bool(true)
var_dump( !1 );        #bool(false)
var_dump( !-1 );       #bool(false)
var_dump( !false );    #bool(true)
var_dump( !null );     #bool(true)
var_dump( !'' );       #bool(true)
var_dump( !'a' );      #bool(false)
echo "\n";
var_dump( false == 0 );        #bool(true)
var_dump( false == 1 );        #bool(false)
var_dump( false == -1 );       #bool(false)
var_dump( false == false );    #bool(true)
var_dump( false == null );     #bool(true)
var_dump( false == '' );       #bool(true)
var_dump( false == 'a' );      #bool(false)
echo "\n";
var_dump( null == 0 );        #bool(true)
var_dump( null == 1 );        #bool(false)
var_dump( null == -1 );       #bool(false)
var_dump( null == false );    #bool(true)
var_dump( null == null );     #bool(true)
var_dump( null == '' );       #bool(true)
var_dump( null == 'a' );      #bool(false)
echo "\n";
$a=0; var_dump( empty($a) );        #bool(true)
$a=1; var_dump( empty($a) );        #bool(false)
$a=-1; var_dump( empty($a) );       #bool(false)
$a=false; var_dump( empty($a) );    #bool(true)
$a=null; var_dump( empty($a) );     #bool(true)
$a=''; var_dump( empty($a) );       #bool(true)
$a='a'; var_dump( empty($a));      # bool(false)
echo "\n"; #new block suggested by @thehpi
var_dump( null < -1 ); #bool(true)
var_dump( null < 0 ); #bool(false)
var_dump( null < 1 ); #bool(true)
var_dump( -1 > true ); #bool(false)
var_dump( 0 > true ); #bool(false)
var_dump( 1 > true ); #bool(true)
var_dump( -1 > false ); #bool(true)
var_dump( 0 > false ); #bool(false)
var_dump( 1 > true ); #bool(true)
41
gcb

以下に例を示します。

            Comparisons of $x with PHP functions

Expression          gettype()   empty()     is_null()   isset() boolean : if($x)
$x = "";            string      TRUE        FALSE       TRUE    FALSE
$x = null;          NULL        TRUE        TRUE        FALSE   FALSE
var $x;             NULL        TRUE        TRUE        FALSE   FALSE
$x is undefined     NULL        TRUE        TRUE        FALSE   FALSE
$x = array();       array       TRUE        FALSE       TRUE    FALSE
$x = false;         boolean     TRUE        FALSE       TRUE    FALSE
$x = true;          boolean     FALSE       FALSE       TRUE    TRUE
$x = 1;             integer     FALSE       FALSE       TRUE    TRUE
$x = 42;            integer     FALSE       FALSE       TRUE    TRUE
$x = 0;             integer     TRUE        FALSE       TRUE    FALSE
$x = -1;            integer     FALSE       FALSE       TRUE    TRUE
$x = "1";           string      FALSE       FALSE       TRUE    TRUE
$x = "0";           string      TRUE        FALSE       TRUE    FALSE
$x = "-1";          string      FALSE       FALSE       TRUE    TRUE
$x = "php";         string      FALSE       FALSE       TRUE    TRUE
$x = "true";        string      FALSE       FALSE       TRUE    TRUE
$x = "false";       string      FALSE       FALSE       TRUE    TRUE

PHPの 型比較 の詳細については、こちらをご覧ください。明確な理解が得られるはずです。

15
KristCont

PHPでは、===および!==演算子を使用して、値が等しいかどうかだけでなく、タイプが一致するかどうかを確認できます。たとえば、0 == falsetrueですが、0 === falsefalseです。 !=!==についても同様です。また、前述の演算子を使用してnullを他の2つと比較する場合、同様の結果が期待されます。

PHPでは、この値の品質は通常0(ゼロ)の値を返すときに使用されますが、関数が失敗した場合もあります。 PHPのそのような場合、falseを返し、ID演算子===を使用してこれらのケースをチェックする必要があります。たとえば、ある文字列の位置を他の文字列の内側で検索し、strpos()を使用している場合、この関数は文字列が最初に見つかった場合は0になる数値位置を返しますが、文字列がまったく見つからない場合、strpos()falseを返します。結果を処理するときは、これを考慮する必要があります。

関数で同じ手法を使用する場合、標準のPHPライブラリーに精通している人なら誰でも何が起こっているのか、戻り値が必要なものであるか、処理中にエラーが発生したかを確認する方法を理解できます。実際には関数パラメーターについても同じことが言えます。配列または文字列であるかどうかに応じて異なる方法で処理できます。この手法はPHPでも使用されているため、誰でも簡単に取得できます。だから私はそれが力だと思います。

5
inkredibl

False、Null、Nothing、0、Undefinedなどなど.

これらのそれぞれには、実際の概念と相関する特定の意味があります。複数の意味が単一のキーワードまたは値にオーバーロードされる場合があります。

CおよびC++では、NULLFalseおよび0は同じ値にオーバーロードされます。 C#では、3つの異なる概念です。

nullまたはNULLは、通常、値がないことを示しますが、通常、理由を指定しません。 0は自然数0を示し、1、2、3、などと型が同等です。また、NULLの個別の概念をサポートする言語では、数字のみを処理する必要があります。

Falseは非真実を示します。そして、それはバイナリ値で使用されました。設定されていないという意味ではなく、0を意味するわけでもありません。 2つのバイナリ値のいずれかを単に示します。

値が、nullと同じことを示すものではなく意図的に設定されていることを示すことはできません。

一部の言語で未定義は、実際の値を指定したコードがないため、値がまだ設定されていないことを示します。

5
Orion Adrian

0nullfalseのいずれかを取得して、stropsから戻るために1日1/2を無駄にしています。

ロジックが正しい方向に流れておらず、PHPコーディングにブラックホールがあるように思える前に、これが私がやろうとしていたことのすべてです。

コンセプトは、サーバーでホストされているドメイン名を取得し、それがルートレベルではないことを確認します。これを行うにはいくつかの異なる方法がありますが、私は他のphp関数/コンストラクトによって異なるものを選択しました。

とにかくここにコーディングの基礎がありました:

if (strpos($_SERVER ['SERVER_NAME'], dirBaseNAME ()) 
{ 
    do this 
} else {
    or that
}

{
echo strpos(mydomain.co.uk, mydomain);  

if ( strpos(mydomain, xmas) == null ) 
    {
        echo "\n1 is null"; 
    }

if ( (strpos(mydomain.co.uk, mydomain)) == 0 ) 
    {
        echo "\n2 is 0"; 
    } else {
        echo "\n2 Something is WRONG"; 
    }

if ( (mydomain.co.uk, mydomain)) != 0 ) 
    {
        echo "\n3 is 0"; 
    } else {
        echo "\n3 it is not 0"; 
    }

if ( (mydomain.co.uk, mydomain)) == null ) 
    {
        echo "\n4 is null"; 
    } else {
        echo "\n4 Something is WRONG"; 
    }
}

最後に、このトピックを読んだ後、これが機能することがわかりました!!!

{
if ((mydomain.co.uk, mydomain)) !== false ) 
    {
        echo "\n5 is True"; 
    } else {
        echo "\n5 is False"; 
    }
}

この記事のおかげで、クリスマスでも、falseの日でもあり得るので、NULLのようにクリスマスではないかもしれません!

簡単なコードをデバッグするのに1日費やした後、問題を特定することができたので、それを機能させるためにあちこちに行くのではなく、これを以前に知っていたらよかったのにと思います。 FalseNULLおよび0True or False or NULLと同じではないため、機能しませんでした。

4
madesignUK

PHPオンラインドキュメント から:

値をブール値に明示的に変換するには、(bool)または(boolean)キャストを使用します。
ただし、演​​算子、関数、または制御構造がブール引数を必要とする場合、値は自動的に変換されるため、ほとんどの場合、キャストは不要です。
ブール値に変換する場合、次の値はFALSEと見なされます。

  • ブール値FALSE自体
  • 整数 `` 0(ゼロ)
  • フロート0.0(ゼロ)
  • 空の文字列、および文字列"0"
  • 要素がゼロの配列
  • メンバー変数がゼロのオブジェクト(PHP 4のみ)
  • 特別なタイプNULL(未設定変数を含む)
  • 空のタグから作成されたSimpleXMLオブジェクト
    他の値はすべてTRUE(リソースを含む)とみなされます。

したがって、ほとんどの場合、同じです。

一方、=====は同じものではありません。通常、必要なのは「等しい」演算子だけです。明確にするために:

$a == $b    //Equal. TRUE if $a is equal to $b.
$a === $b   //Identical. TRUE if $a is equal to $b, and they are of the same type. 

詳細については、PHPオンラインドキュメントの「 Comparison Operators 」ページを確認してください。

お役に立てれば。

2

これらの値の違いは、常に詳細な言語固有のルールに基づいています。 PHPについて学ぶことは、Python、Perl、またはCなどには必ずしも当てはまりません。使用している言語のルールを学ぶことは重要ですが、それらに依存することあまりにも多くのトラブルを求めています。問題は、次のプログラマーがコードを保守する必要があり、Null vs. False(たとえば)の少し詳細を利用する構造を使用したときに発生します。あなたのコードは正しく見えるはずです(そして逆に、 間違ったコードは間違っているはずです )。

1
Greg Hewgill

NULLは、データベースで「レコードなし」または「情報なし」を表すために使用されます。したがって、「このユーザーは私たちから電子メールを送信したいのか」を説明するビットフィールドがあるかもしれません。Trueは送信を、Falseは送信を望まないが、Nullは送信を望まないことを意味します。わかりません。それらは、外部結合などを通じて発生します。

Nullの論理的な意味はしばしば異なります-一部の言語ではNULLは何にも等しくないため、if(a == NULL)は常にfalseです。

個人的に私は常にブール値をFALSEに初期化し、1つをNULLに初期化することは少し厄介に見えます(2つが両方とも0であるCでも...スタイルのことです)。

1
Peter

PHPでは、型を検証するかどうかによって異なります。

( 
 ( false !== 0 ) && ( false !== -1 ) && ( false == 0 ) && ( false == -1 ) &&
 ( false !== null ) && ( false == null ) 
)

技術的にnullは0x00ですが、PHP ( null == 0x00 ) && ( null !== 0x00 )にあります。

0は整数値です。

1
Gavin M. Roy

悪い開発者は、そこのコードでnull/0/falseのさまざまな使用法をすべて見つけると思います。

たとえば、開発者が犯す最も一般的な間違いの1つは、関数でデータの形式でエラーコードを返すことです。

// On error GetChar returns -1
int GetChar()

これは、シュガーインターフェイスの例です。これは、「ソフトウェア開発プロセスのデバッグ」という本と、「正しいコードを書く」という別の本で説明されています。

これに伴う問題は、char型で行われる意味または仮定です。一部のコンパイラでは、char型は符号なしにすることができます。したがって、-1を返しても、コンパイラは代わりに1を返すことができます。 C++またはCでのこれらの種類のコンパイラーの前提を見つけるのは困難です。

代わりに、エラーコードとデータを混在させないことが最善の方法です。だから次の機能。

char GetChar()

今になります

// On success return 1
// on failure return 0
bool GetChar(int &char)

これは、開発者があなたの開発ショップでどれだけ若くても、彼または彼女がこの間違いを決して犯さないことを意味します。ただし、これはコードの冗長性や依存関係についてではありません。

だから、一般的に、言語の最初のクラスのタイプとしてブールを交換しても大丈夫であり、私はジョエルが彼の最近のポストキャストでそれについて話したと思う。しかし、ルーチン内でデータとboolを組み合わせて使用​​しないようにしてください。そうすれば、まったく問題ないはずです。

1
Chad

PHPのNULLに関する興味深い事実:NULLに等しい変数を設定した場合、unset()を呼び出した場合と同じです。

NULLは本質的に、変数に値が割り当てられていないことを意味します。 falseは有効なブール値、0は有効な整数値、PHPは0"0"""、およびfalse

1
dirtside

Nullは無、Falseはビット、0は(おそらく)32ビットです。

PHPの専門家ではありませんが、一部の最新言語では互換性がありません。 0とfalseが交換可能であることをミスしますが、ブール値が実際のタイプであるため、メソッドとオブジェクトをそれに関連付けることができるため、トレードオフになります。 Nullはnullですが、本質的には何もありません。

0
CodeRedick

Falseと0は概念的に類似しています。つまり、同型です。 0は自然数の代数の初期値であり、Falseはブール代数の初期値です。

言い換えると、0は、自然数に追加すると同じ数になる数値として定義できます。

x + 0 = x

同様に、Falseは、それと他の値の選言がその同じ値になるような値です。

x || False = x

Nullは概念的にはまったく異なるものです。言語に応じて、セマンティクスは異なりますが、「初期値」をFalseおよび0として記述するものはありません。 Nullの代数はありません。これは変数に関係し、通常、現在のコンテキストでは変数に特定の値がないことを示します。ほとんどの言語では、Nullに定義された操作はなく、Nullをオペランドとして使用するとエラーになります。一部の言語では、「null」ではなく「bottom」と呼ばれる特別な値があります。これは、終了しない計算の値のプレースホルダーです。

他の場所でNULLの意味についてより広範囲に書いた。

0
Apocalisp

まあ、私のPHP日から「===」の部分に答えるのに十分覚えていないが、ほとんどのCスタイル言語では、ポインター値のコンテキストでNULLを使用する必要があります。ブール値、およびintなどの数値としてのゼロ。 '\ 0'は、文字コンテキストの慣習的な値です。私は通常、floatとdoubleに0.0を使用することも好みます。

簡単な答えは、コンテキストです。

0
jasonmray

ほとんどすべての現代言語では、null 論理的には、値を持たないポインター(または参照)、または初期化されていない変数を指します。 0は整数値0であり、falseはfalseのブール値です。物事を複雑にするために、たとえばCでは、null、0、およびfalseはすべてまったく同じ方法で表されます。 PHPでの動作がわかりません。

さらに、事態をさらに複雑にするために、データベースにはnullの概念があり、これは欠落または適用不可を意味し、ほとんどの言語にはDBNullをnullに直接マップする方法がありません。たとえば、最近まで、intがnullであるかゼロであるかの区別はありませんでしたが、null許容のintで変更されました。

この音を複雑にしてすみません。これは何年もの間、言語のハリースティックポイントであり、最近まで明確な解決策がどこにもなかったというだけです。人々は単に物事をまとめたり、空白や0をデータベース内のヌルを表すようにしただけでしたが、これは必ずしもうまく機能するとは限りません。

0
Charles Graham

誰かが「NULL」が単なる比較インスタンスの文字列ではない理由を説明できますか?

$x = 0;
var_dump($x == 'NULL');  # TRUE   !!!WTF!!!
0
vladzur

一般に、プログラミング言語は真実で偽りの値を持つ傾向があります。何が真実で何が偽物であるかのルールは、言語ごとに異なります。

http://www.isolani.co.uk/blog/javascript/TruthyFalsyAndTypeCasting

0
Liam