PHPにおけるNull対False対0


146

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


何が使用されているかを実際に理解することはほとんど不可能です。私はそれはあなたが使用するときに一貫性していることが重要だと思うnullときとfalse。私が使用して好むnull方法から値を取得する際に、私が使用することができますので、isset値が代わりに使用するので返されるかどうかを判断するためにempty:口座に反映されませんこれはfalse0'0'または空の文字列は、多くの状況で実行可能な値とすることができます。私にとっては、厄介な構成の中で最もクリーンなソリューションです。
JMRC 2016

回答:


221

言語固有ですが、PHPでは:

Nullなし」を意味します。変数は初期化されていません。

Falseブール値のコンテキストでは当てはまらない」という意味です。論理的な問題を扱っていることを明示するために使用されます。

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(まったく設定しないと、ハードデバッグにつながる;-))の間に違いを作りたい。


39
Nullに関する注意:PHPはこれを「値なし」として使用しますが、これは慣れるのに適した習慣ではありません。一般に、Nullは「不明な値」を意味し、「値なし」や「初期化されていない変数」とは異なります。何もプラス1は1ではなく、不明な値プラス1は不明な値です。「不明な値」に対する操作は不明な値になるため、nullに適用される演算子はnullになる(するはずです)ことに注意してください。
Eli

7
これはすべての意図であることを覚えておいてください。実際に起こることとは何の関係もありません。実際には、関数は存在しない値(strpos、input_filterなど)に対してfalseを返し、失敗(たとえば、input_filter)に対してnullを返すことがあります。したがって、答えは、特定の関数のドキュメントを読んだ後、=== falseまたは=== nullを使用することです。
gcb

5
@Eli:Nullは一般に「不明な値」を意味するという考えはどこで得られますか。これが真実であるコンピューター言語を考えることはできません。また、少なくとも英語で、私が見つけたり聞いたりした定義に従っていないことを意味しません。多分あなたは私が知らない何かを知っていますか?
iconoclast 2012

2
@iconoclast-データベースの世界から取得しています。私が理解しているように、nullは、データベースに存在しないか不明なデータ値のプレースホルダーとして使用されます。dev.mysql.com/doc/refman/5.0/en/working-with-null.htmlまたはen.wikipedia.org/wiki/Null_%28SQL%29を参照してください。
Eli

2
エリは間違いない。彼は意味的には、nullを使用すると、そこに何があるのか​​分からないことを他のプログラマーに知らせると述べています。未定義です。一方、0を使用すると、そこに何があるかがわかっていることを通知します。そして、ここでの数字は、物がないことを表しています。PHPがどのように値を脅かしても、値には意味があり、値はドキュメントの形式であることを忘れないでください。
e-satis 2016年

45

nullですnullfalseですfalse。悲しいですが本当。

PHPの一貫性はあまりありません。開発者TRY nullの手段「不明な」または「存在しない」を作ること。しかし、Falseはしばしば「存在しない」として機能します(たとえば、strrpos( 'fail'、 'search')はfalseを返し、nullではありません)

すでに何かにfalseを使用しているときに、nullが使用されていることがよくあります。例:filter_input()。変数がフィルターに失敗した場合は、falseを返します。変数が存在しない場合はnull(存在しないことは、フィルターも失敗したことを意味するので、なぜ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)

24
私の意見では0 == nullは絶対的な意味があります。0は値であり、nullは変数が初期化されていないことを示すフラグです。ありがとうphpチーム
メルセン

1
で始まるコードのセクションを2回繰り返しましたvar_dump( null == 0 );
Sparky 2013年

2
PHP

1
@mercsen少なくとも、PHPが一貫して0 == nullのように動作した場合、問題はありませんでした。奇妙なことに、0 == nullそしてnull == []、しかし[] != 0!!
nawfal 2015年

1
strrpos('fail', 'search') will return false, and not null私の意見では正しい- null意味不明の場合、strrpos戻るnullことは、「文字列が存在しない」ではなく、「文字列が存在するかどうかわからない」と言うようなものになるでしょう。
Eborbob

22

以下に例を示します。

            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 での型比較の詳細については、こちらをご覧ください。それはあなたに明確な理解を与えるはずです。


5

PHPでは、===および!==演算子を使用して、値が等しいかどうかだけでなく、型が一致するかどうかもチェックできます。だから例えば:0 == falseis trueですが0 === falseis falseです。!=対についても同じ!==です。比較する場合にもnull、上記の演算子を使用して他の2つとする、同様の結果が期待できます。

現在PHPでは、この値の品質は通常0、(ゼロ)になる可能性のある値を返すときに使用されますが、関数が失敗した可能性もあります。このような場合、PHPでは戻りfalse、アイデンティティー演算子を使用してこれらのケースを確認する必要があります===。たとえば、ある文字列の位置を他の文字列の内部で検索し、を使用している場合strpos()、この関数は文字列が最初に見つかった場合は0になる可能性がある数値位置を返しますが、文字列がすべて、次にstrpos()戻りますfalseので、結果を処理するときにこれを考慮に入れる必要があります。

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


5

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

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

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

nullまたはNULL通常は価値の欠如を示しますが、通常は理由を特定しません。 0自然数ゼロを示し、1、2、3などと型が同等であり、個別の概念をサポートする言語でNULLは、数値のみを扱う必要があります。

Falseは非真実を示します。そして、それはバイナリ値で使用されました。未設定という意味でも、でもありません0。2つのバイナリ値の1つを示すだけです。

値がnullと同じことを示すものとして明確に何も設定されていないことを示すことはできませんが、意図はあります。

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


興味深いかもしれませんが、PHPについてはまったく触れていません。
ブラッド

4

私はどちらかの取得しようとして半日を無駄にしている0nullfalseから復帰しますstrops

ロジックが正しい方向に流れていないことに気づく前に、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そして0、すべて同じではありませんかTrue or False or NULL


2

PHPオンラインドキュメント

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

  • ブールFALSEそのもの
  • 整数 `` 0(ゼロ)
  • float 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オンラインドキュメントの「比較演算子」ページを確認してください。

お役に立てれば。


1

これらの値の違いは、常に詳細な言語固有のルールに帰着します。PHPについて学んだことは、必ずしもPython、Perl、Cなどに当てはまるわけではありません。使用している言語のルールを学ぶことは価値がありますが、それらに過度に依存するとトラブルが発生します。 。問題は、次のプログラマーがコードを保守する必要があり、NullとFalseの(たとえば)細かい部分を利用する構造を使用した場合です。コードは正しく見えるはずです(逆に、間違ったコードは間違っているはずです)。


1

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

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

したがって、個人的には常にブール値をFALSEに初期化し、1をNULLに初期化することは少し不格好に見えます(Cでも、2つが0であるだけで、単なるスタイルのことです)。


1

悪い開発者は、コードで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

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

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

厳密にはnullは0x00PHPにあり( null == 0x00 ) && ( null !== 0x00 )ます。

0 整数値です。


1

NULLPHP に関する興味深い事実の1つは、varをに設定した場合NULL、それを呼び出しunset()た場合と同じです。

NULL本質的に、変数には値が割り当てられていないことを意味します。false有効なブール値であり、0有効な整数値であり、PHPは、いくつかの間にかなり醜い変換を持っている0"0"""、とfalse


0

Nullは何もない、Falseは少し、0は(おそらく)32ビットです。

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


0

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

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


0

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

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

この音を複雑にしてすみません。これは何年にもわたって言語でのハリーな問題であり、最近まで、どこにも明確な解決策がありませんでした。人々は物事をくたくたにしたり、空白または0にしたりして、データベース内のnullを表していましたが、これは常にうまくいくとは限りません。


0

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

つまり、0は、ある自然数に追加したときに同じ数になる数として定義できます。

x + 0 = x

同様に、Falseは、その値と他の値の論理和が同じ値になるような値です。

x || False = x

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

他の場所でのNULLの影響について、より広範囲に書きました。


1
オフトピック、false == 0は完全に抑制されます。phpがデータを返すか、関数でエラーが発生すると、さらにそうなります。mysql_insert_idの戻りを参照してください。"" "前回のクエリでAUTO_INCREMENT列に対して生成されたIDが成功した場合、前のクエリでAUTO_INCREMENT値が生成されなかった場合は0、MySQL接続が確立されていない場合はFALSE" ""基本的にA)を返すことができます。 B)ゼロ、C)偽...これがテーブルの最初の項目である場合、IDはゼロになります!したがって、3つの値はすべて同じです!開発者は3種類のゼロをどのように理解できますか?...そして私はあなたのnullに関する投稿に同意します。
gcb

0

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

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

1
PHPが内部的に整数型にキャストしてから比較するためです。php > var_dump((int) "NULL"); // => int(0) php > var_dump((int) "BLA"); // => int(0)php.net/manual/en/language.operators.comparison.phpを参照してください。文字列とリソースを数値に変換します。通常の計算
Sevyls

-1

偽りの問題は、PHPの歴史に由来します。問題は、明確に定義されていないスカラー型を対象としています。

'*' == true -> true (string match)
'*' === true -> false (numberic match)

(int)'*' == true -> false
(string)'*' == true -> true

PHP7の厳格さは一歩前進ですが、おそらく十分ではありません。https://web-techno.net/typing-with-php-7-what-you-shouldnt-do/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.