131


43

ヌルvs. 偽対 PHPでは0

私は、良い開発者は Null`と False`と `0`と他のすべての良い「なにもしない」実体との違いを見つける/利用することができると言われています。 特にPHPの違いは何ですか? それは `===`と関係がありますか?

19 Answer


197


それは言語特有ですが、PHPでは:

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

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

  • 0 ` int` *です。 上記の残りの部分とは関係なく、数学に使用されます。

さて、注意が必要なのは、PHPのような動的言語では、それらのすべてが(PHPでは) `False`であるブール値のコンテキストで値を持つということです。

あなたがそれを `==`でテストするなら、それはブール値をテストするので、あなたは平等を得るでしょう。 あなたが `===`でそれをテストするなら、それは型をテストするでしょう、そしてあなたは不等式を得るでしょう。

それではなぜそれらは有用なのでしょうか?

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


そしてもちろん、あなたが州を扱うならば:

DebugMode = False(offに設定)、` DebugMode = True`(onに設定)、 DebugMode = Null(まったく設定されていない、ハードデバッグになります;-))の間で違いを作りたいです。


41


null`は null`です。 false`は false`です。 悲しいですが本当。

PHPにはあまり一貫性がありません。 開発者が_TRY_をnullにすることは、「未知」または「存在しない」ことを意味します。 しかし、多くの場合、Falseは「存在しない」として機能します(例: strrpos( 'fail'、 'search')はfalseを返し、nullではありません)

あなたが彼らが何かのためにすでにfalseを使っているとき、あなたはしばしばnullが使われるのを見るでしょう。 e.g. filter_input() 変数がフィルタに失敗した場合はfalseを返します。 変数が存在しない場合はnull(存在しない場合はフィルタも失敗したことを意味しますか?) では、なぜnullを返すのでしょうか。

phpは関数にデータを返すという便利さがあります。 そしてデータではなくあらゆる種類の失敗ステータスを開発者が詰め込むことがよくあります。

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

関数に応じて、常に=== 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)


14


以下はその例です。

PHP関数と$ xの比較

式gettype()empty()is_null()isset()boolean:if($ x)$ x = "";ストリングTRUE FALSE TRUE FALSE $ x = null。 NULL TRUE TRUE FALSE FALSE var $ x; NULL TRUE TRUE FALSE FALSE $ xは未定義ですNULL TRUE TRUE FALSE FALSE $ x = array();配列TRUE FALSE TRUE FALSE $ x = false。ブール値TRUE FALSE TRUE FALSE $ x = true;ブール値FALSE FALSE TRUE TRUE $ x = 1。整数FALSE FALSE TRUE TRUE $ x = 42。整数FALSE FALSE TRUE TRUE $ x = 0。整数TRUE FALSE TRUE FALSE $ x = -1。整数FALSE FALSE TRUE TRUE $ x = "1";文字列FALSE FALSE TRUE TRUE $ x = "0";ストリングTRUE FALSE TRUE FALSE $ x = "-1";文字列FALSE FALSE TRUE TRUE $ x = "php";ストリングFALSE FALSE TRUE TRUE $ x = "true";ストリングFALSE FALSE TRUE TRUE $ x = "false";ストリングFALSE FALSE TRUE TRUE

PHPの type比較の詳細については、こちらを参照してください。 それはあなたに明確な理解を与えるはずです。


5


  • False、Null、Nothing、0、Undefined *など

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

  • C C *では、NULL、False、0が同じ値にオーバーロードされています。 * C#*では、それらは3つの異なる概念です。

null`や NULL`は通常値がないことを示しますが、通常その理由を指定しません。 `0`は自然数0を表し、* 1、2、3、*などと同等の型を持ちます。 そして、別々の「NULL」の概念をサポートする言語では、数字だけで扱われるべきです。

  • False *は真実ではないことを示します。 そしてそれは*バイナリ値*で使われていました。 それは設定解除を意味するのではなく、それは `0`を意味するのでもありません。 単に2つのバイナリ値のうちの1つを示します。

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

コードによって実際の値が指定されていないため、値がまだ設定されていないことを示す言語もあります。


5


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

現在のPHPでは、この値の品質は通常 0 '(ゼロ)になることがある値を返すときに使用されますが、時には関数が失敗した可能性があります。 PHPではそのような場合には `false`を返します。そしてこれらの場合を識別演算子 === `を使ってチェックしなければなりません。 たとえば、ある文字列の位置を別の文字列の内側で検索していて、 `strpos()`を使っている場合、この関数は文字列が最初に見つかった場合は0になります。 stringがまったく見つからない場合、 `strpos()`は `false`を返しますので、結果を扱う際にはこれを考慮に入れる必要があります。

あなたが自分の関数で同じテクニックを使うのであれば、標準のPHPライブラリに精通している人なら誰でも何が起こっているのか、そして戻り値が望んでいるものかどうかをチェックする方法を理解するでしょう。 これは実際には関数paramsにも当てはまります。それらが配列であるか文字列であるかどうかに応じて異なる方法で処理することができます。この手法はPHP全体でも頻繁に使用されるため、誰でも簡単に実行できます。 だから私はそれが力だと思います。


4


strposから0、null、falseのいずれかのリターンを取得しようとして1日に1/2回無駄にしました。

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

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

とにかくここではcosingの基礎でした:

if(strpos($ _ SERVER ['SERVER_NAME']、dirBaseNAME()){do this} else {またはthat} {echo strpos(mydomain.co.uk、mydomain);}

if(strpos(mydomain、xmas)== null){echo "\ n1はnull"; if((strpos(mydomain.co.uk、mydomain))== 0){echo "\ n2は0"; } else {echo "\ n2何かが間違っています"; }

if((mydomain.co.uk、mydomain))!= 0){echo "\ n3は0"; } else {echo "\ n3 0ではありません"; }

if((mydomain.co.uk、mydomain))== null){echo "\ n4はnull"; } else {echo "\ n4何かが間違っています"; }}

このトピックを読んだ後、最後に、これがうまくいったことがわかりました!

{if((mydomain.co.uk、mydomain))!== false){echo "\ n5 is true"; } else {echo "\ n5はFalseです"; }}

この記事をありがとう、私は今ではクリスマスだとしても、それはクリスマスではないかもしれないということを理解しています。

単純なコードをデバッグする一日を無駄にした後で、これを知っていたほうがいいのですが、Nullと0がすべて同じではないTrue、False、またはnull?


1


データベースでは、「レコードなし」または「情報なし」を表すためにNULLが使用されます。 つまり、「このユーザーは私たちから電子メールを送信されたいのですか」という簡単なフィールドがあるかもしれません。ここで、Trueは何も送信したくないが、Falseは送信したくないという意味です。わからない。 それらは外部結合などを介して発生する可能性があります。

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

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


1


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

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

技術的にはnullは 0x00`ですがPHPでは(null == 0x00)

「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)

これは、開発者があなたの開発現場でどれほど若くても、彼または彼女がこれを誤解することは決してないだろうということを意味します。 これは、コードの簡潔さや依存関係についての話ではありませんが。

そのため、一般的に、言語の最初のクラスタイプとしてboolを交換することは問題ありません。Joelが最近のポストキャストで話したと思います。 しかし、あなたのルーチンであなたのデータとミックスアンドマッチのブールを使わないようにしてください。


1


http://ar2.php.net/manual/en/language.types.boolean.php[PHPオンラインドキュメント]から:

"値を明示的にブール値に変換するには、(ブール値)または(ブール値)キャストを使用してください。 ただし、ほとんどの場合、キャストは不要です。演算子、関数、または制御構造にブール引数が必要な場合は値が自動的に変換されるためです。 ブール値に変換するときは、次の値がFALSEと見なされます。*ブール値FALSE自体*整数0(ゼロ)*浮動小数点0.0(ゼロ)*空の文字列*文字列 "0" *ゼロ要素を持つ配列 anメンバー変数がゼロのオブジェクト(PHP 4のみ)*特別な型NULL(未設定変数を含む)*空のタグから作成されたSimpleXMLオブジェクトその他すべての値はTRUEと見なされます(すべてのリソースを含む)。

だから、ほとんどの場合、それは同じです。

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

$ a == $ b //等しい。 $ aが$ bと等しい場合はTRUE $ a === $ b //同じです。 $ aが$ bと等しく、それらが同じ型であればTRUE。

詳細については、PHPオンラインドキュメントの " 比較演算子"ページを確認してください。

お役に立てれば。