Null
優れた開発者は、andFalse
と0
他のすべての優れた「何もない」エンティティの違いを見つけて活用できると聞いています。特にPHPの違いは
何ですか? それは何か関係がありますか?===
18 に答える
これは言語固有ですが、PHP では次のようになります。
Null
「何もない」という意味です。変数は初期化されていません。
False
「ブールコンテキストでは真ではない」ことを意味します。論理的な問題を扱っていることを明確に示すために使用されます。
0
ですint
。数学に使用される上記の残りの部分とは関係ありません。
ここで注意が必要なのは、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
(まったく設定しないと、ハードデバッグにつながります;-))の違いを作りたいと思います。
null
ですnull
。false
ですfalse
。悲しいけれど事実です。
PHP にはあまり一貫性がありません (最新のリリースでは改善されていますが、下位互換性が多すぎます)。false
ある程度の一貫性を望んでいる設計にもかかわらず(ここで選択した回答で概説されています)、 /を使用するメソッドの戻り値を考えるとnull
、理由付けがそれほど簡単ではない方法で混乱します。
何かに対してすでに false を使用しているときに、null が使用されていることがよくあります。例えば、filter_input()。変数がフィルターに失敗した場合は false を返し、変数が存在しない場合は null を返します (存在しないということは、フィルターにも失敗したことを意味しますか?)
false/null/string/etc を交換可能に返すメソッドは、作成者が失敗の種類を気にする場合のハックです。たとえば、検証が失敗した理由filter_input()
をチェックし===false
たり===null
気にしたりすることができます。===null
しかし、そうしないと、 のテストケースを書くことだけを覚えていれば、 のチェックを追加するのを忘れる可能性があるため、落とし穴になる可能性があります===false
。そして、ほとんどの php ユニット テスト/カバレッジ ツールは、欠落しているテストされていないコード パスに対して注意を喚起しません。
最後に、型ジャグリングの楽しみ方を紹介します。配列やオブジェクトも含めません。
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)
以下に例を示します。
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での型比較の詳細については、こちらを参照してください。それはあなたに明確な理解を与えるはずです。
PHP では、 === および !== 演算子を使用して、値が等しいかどうかだけでなく、型が一致するかどうかも確認できます。例: 0 == false
is true
, but 0 === false
is false
. !=
対についても同様!==
です。また、上記の演算子を使用して他の 2 つと比較する場合もnull
、同様の結果が期待できます。
現在、PHP では、この値の品質は、(ゼロ) になることもある値を返すときに通常使用されます0
が、関数が失敗した場合もあります。このような場合、PHP では返されfalse
、identity operator を使用してこれらのケースを確認する必要があります===
。たとえば、ある文字列の位置を別の文字列内で検索し、 を使用している場合strpos()
、この関数は数値位置を返します。文字列が最初に見つかった場合は 0 になる可能性がありますが、文字列が最初に見つからない場合は 0 になります。結果を処理するときは、これを考慮に入れる必要がありますstrpos()
。false
関数で同じ手法を使用する場合、標準の PHP ライブラリに精通している人なら、何が起こっているのか、戻り値が必要なものであるかどうか、または処理中にエラーが発生したかどうかを確認する方法を理解できます。同じことが実際には関数のパラメーターにも当てはまります。配列か文字列かどうかに応じて処理を変えることができます。この手法は PHP でも頻繁に使用されているため、誰もが非常に簡単に理解できます。だから、それが力だと思います。
False、Null、Nothing、0、Undefinedなど。
これらのそれぞれには、実際の概念と相関する特定の意味があります。複数の意味が 1 つのキーワードまたは値にオーバーロードされている場合があります。
CおよびC++ では、、NULL
、False
および0
が同じ値にオーバーロードされます。C#では、これらは 3 つの異なる概念です。
null
またはNULL
通常、価値の欠如を示しますが、通常は理由を特定しません。
は自然数のゼロを示し、1、2、30
などと型が同等であり、別の概念をサポートする言語では、数値のみを扱う必要があります。NULL
Falseは真実でないことを示します。そして、バイナリ値で使用されます。unset という意味でも、 という意味でもありません0
。2 つのバイナリ値のいずれかを示すだけです。
値がnullと同じことを示すが意図的に何もないことを示すように具体的に設定されていることを示すものは何もありません。
一部の言語での未定義は、コードで実際の値が指定されていないため、値がまだ設定されていないことを示します。
0
、null
、false
から戻るために 1 日 1/2 を無駄にしましたstrops
。
PHPコーディングにブラックホールがあるように見えて、ロジックが正しい方向に流れていないことに気付く前に、私がやろうとしていたのは次のとおりです。
コンセプトは、サーバーでホストされているドメイン名を取得し、それがルートレベルではないことを確認します。これを行うにはいくつかの異なる方法がありますが、私が行った他のphp関数/構造のために別の方法を選択しました.
とにかく、ここにcosingの基礎がありました:
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 日を費やした後、問題を機能させるためにあちこちに行くのではなく、問題を特定できたので、これを以前に知っていればよかったと思います。False
、NULL
およびすべてが?0
と同じではないため、機能しませんでした。True or False or NULL
値を明示的にブール値に変換するには、(bool) または (boolean) キャストを使用します。
ただし、演算子、関数、または制御構造がブール引数を必要とする場合、値は自動的に変換されるため、ほとんどの場合、キャストは不要です。
ブール値に変換する場合、次の値は FALSE と見なされます。
- ブール値
FALSE
そのもの - 整数 `0 (ゼロ)
- フロート
0.0
(ゼロ) - 空文字列と文字列
"0"
- 要素がゼロの配列
- メンバー変数がゼロのオブジェクト (PHP 4 のみ)
- 特別な型
NULL
(未設定の変数を含む) - 空のタグから作成された SimpleXML オブジェクト
その他すべての値が考慮されますTRUE
(すべてのリソースを含む)。
したがって、ほとんどの場合、同じです。
一方、===
と==
は同じものではありません。通常は、"equals" 演算子だけが必要です。明確にするために:
$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 オンライン ドキュメント の「比較演算子」ページを確認してください。
お役に立てれば。
悪い開発者は、コード内で 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 を言語の最初のクラスの型として交換することは問題ありません。joel が最近のポストキャストでそれについて話していたと思います。ただし、ルーチンでブール値をデータと組み合わせて使用しないようにしてください。完全に問題ないはずです。
PHPに関する 1 つの興味深い事実NULL
: var を に設定するとNULL
、それを呼び出した場合と同じunset()
になります。
NULL
基本的に、変数に値が割り当てられていないことを意味します。false
は有効なブール値で0
あり、 は有効な整数値であり、PHP では、 、 、 、および の間のかなり醜い変換が0
行わ"0"
れ""
ますfalse
。
これらの値の違いは、常に詳細な言語固有の規則に帰着します。PHP について学んだことは、必ずしも Python、Perl、C などに当てはまるとは限りません。使用している言語の規則を学ぶことは価値がありますが、それらに頼りすぎると問題が生じます。 . 問題が発生するのは、次のプログラマーがあなたのコードを保守する必要があり、Null と False の詳細を利用する構成を使用した場合です (たとえば)。コードは正しく見えるはずです (逆に、間違ったコードは間違って見えるはずです)。
Null は、データベースで「レコードなし」または「情報なし」を表すために使用されます。したがって、「このユーザーは私たちから電子メールを送信することを望んでいますか?」を説明するビット フィールドがある場合があります。ここで、True は送信することを意味し、False は何も送信したくないことを意味しますが、Null は送信しないことを意味します。知りません。それらは、外部結合などによって発生する可能性があります。
Null の論理的な意味はしばしば異なります。一部の言語では NULL は何にも等しくないため、if(a == NULL) は常に false になります。
したがって、個人的には常にブール値を FALSE に初期化し、1 つを NULL に初期化するのは少し厄介に見えます (2 つが両方とも 0 である C でさえ... スタイルの問題です)。
PHP では、型を検証しているかどうかによって異なります。
(
( false !== 0 ) && ( false !== -1 ) && ( false == 0 ) && ( false == -1 ) &&
( false !== null ) && ( false == null )
)
技術的には null は0x00
PHP にあります( null == 0x00 ) && ( null !== 0x00 )
。
0
整数値です。
現代のほぼすべての言語で、nullは、値を持たないポインター (または参照)、または初期化されていない変数を論理的に参照します。0 はゼロの整数値で、false はブール値です。ややこしいことに、たとえば C では、null、0、および false はすべてまったく同じ方法で表現されます。PHPでどのように機能するかわかりません。
さらに複雑なことに、データベースには null の概念があります。これは、存在しないか適用できないことを意味し、ほとんどの言語には DBNull を null に直接マップする方法がありません。たとえば、最近まで、int が null であることとゼロであることの区別はありませんでしたが、null 許容 int によって変更されました。
この音を複雑にして申し訳ありません。ただ、これは何年にもわたって言語の難点であり、最近までどこにも明確な解決策がありませんでした。人々は物事をまとめたり、空白や 0 をデータベース内の null として表現したりしていましたが、これは常にうまく機能するとは限りません。
False と 0 は概念的に似ています。つまり、同形です。0 は自然数代数の初期値、False はブール代数の初期値です。
つまり、0 は、ある自然数に足すと同じ数になる数として定義できます。
x + 0 = x
同様に、False は、それと他の値の論理和が同じ値になるような値です。
x || False = x
Null は、概念的にはまったく異なるものです。言語によってセマンティクスが異なりますが、False や 0 のように「初期値」を記述するものはありません。Null の代数はありません。これは変数に関連し、通常は変数が現在のコンテキストで特定の値を持たないことを示します。ほとんどの言語では、Null に対して定義された操作はなく、Null をオペランドとして使用するとエラーになります。一部の言語では、「null」ではなく「bottom」と呼ばれる特別な値があります。これは、終了しない計算の値のプレースホルダーです。
Null は何もない、False はビット、0 は (おそらく) 32 ビットです。
PHP の専門家ではありませんが、最近のいくつかの言語では、これらは互換性がありません。0 と false が交換可能であることをちょっと見逃していますが、boolean が実際の型であるため、メソッドとオブジェクトを関連付けることができるので、それは単なるトレードオフです。Null は null ですが、本質的には何もありません。
まあ、私は PHP 時代から "===" の部分に答えるのに十分な記憶がありませんが、ほとんどの C スタイルの言語では、ポインター値のコンテキストでは NULL を使用し、ブール値として false を使用し、値として 0 を使用する必要があります。 int などの数値。'\0' は、文字コンテキストの通常の値です。通常、float と double には 0.0 を使用することも好みます。
だから..簡単な答えは:コンテキストです。