回答:
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の一貫性はあまりありません。開発者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)
var_dump( null == 0 );
。
0 == null
そしてnull == []
、しかし[] != 0
!!
strrpos('fail', 'search') will return false, and not null
私の意見では正しい- null
意味不明の場合、strrpos
戻るnull
ことは、「文字列が存在しない」ではなく、「文字列が存在するかどうかわからない」と言うようなものになるでしょう。
以下に例を示します。
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
ですが0 === false
is false
です。!=
対についても同じ!==
です。比較する場合にもnull
、上記の演算子を使用して他の2つとする、同様の結果が期待できます。
現在PHPでは、この値の品質は通常0
、(ゼロ)になる可能性のある値を返すときに使用されますが、関数が失敗した可能性もあります。このような場合、PHPでは戻りfalse
、アイデンティティー演算子を使用してこれらのケースを確認する必要があります===
。たとえば、ある文字列の位置を他の文字列の内部で検索し、を使用している場合strpos()
、この関数は文字列が最初に見つかった場合は0になる可能性がある数値位置を返しますが、文字列がすべて、次にstrpos()
戻りますfalse
ので、結果を処理するときにこれを考慮に入れる必要があります。
関数で同じ手法を使用する場合、標準のPHPライブラリに精通している人なら誰でも、何が起こっているのか、戻り値が必要なものか、処理中にエラーが発生したのかを確認する方法を理解できます。実際に同じことが関数のパラメーターにも当てはまり、配列か文字列かどうかに応じて異なる方法で処理できます。この手法はPHP全体で頻繁に使用されるため、誰でも簡単に取得できます。それが力だと思います。
False、Null、Nothing、0、Undefinedなど。
これらにはそれぞれ、実際の概念と相関する特定の意味があります。複数の意味が単一のキーワードまたは値に多重定義される場合があります。
でCおよびC ++、NULL
、False
と0
同じ値にオーバーロードされています。ではC# 、彼らは3つの異なる概念です。
null
またはNULL
通常は価値の欠如を示しますが、通常は理由を特定しません。
0
自然数ゼロを示し、1、2、3などと型が同等であり、個別の概念をサポートする言語でNULL
は、数値のみを扱う必要があります。
Falseは非真実を示します。そして、それはバイナリ値で使用されました。未設定という意味でも、でもありません0
。2つのバイナリ値の1つを示すだけです。
値がnullと同じことを示すものとして明確に何も設定されていないことを示すことはできませんが、意図はあります。
一部の言語で未定義は、実際の値を指定したコードがないため、値がまだ設定されていないことを示します。
私はどちらかの取得しようとして半日を無駄にしている0
、null
、false
から復帰します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日を費やした後、問題を特定することができれば、問題を特定することができたので、以前から知っていればよかったのですが。これは、前述したように、仕事しませんでしたFalse
、NULL
そして0
、すべて同じではありませんかTrue or False or NULL
?
値を明示的にブール値に変換するには、(bool)または(boolean)キャストを使用します。
ただし、演算子、関数、または制御構造にブール引数が必要な場合、値は自動的に変換されるため、ほとんどの場合、キャストは不要です。
ブール値に変換する場合、次の値はFALSEと見なされます。
FALSE
そのもの 0.0
(ゼロ) "0"
NULL
(未設定の変数を含む) 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オンラインドキュメントの「比較演算子」ページを確認してください。
お役に立てれば。
これらの値の違いは、常に詳細な言語固有のルールに帰着します。PHPについて学んだことは、必ずしもPython、Perl、Cなどに当てはまるわけではありません。使用している言語のルールを学ぶことは価値がありますが、それらに過度に依存するとトラブルが発生します。 。問題は、次のプログラマーがコードを保守する必要があり、NullとFalseの(たとえば)細かい部分を利用する構造を使用した場合です。コードは正しく見えるはずです(逆に、間違ったコードは間違っているはずです)。
Nullは、データベースで「レコードなし」または「情報なし」を表すために使用されます。したがって、「このユーザーに私たちから電子メールを送信したいですか」というビットフィールドがある場合があります。Trueは送信する、Falseは送信しないことを意味しますが、Nullは送信しないことを意味します知っている。それらは、外部結合などを通じて発生します。
多くの場合、Nullの論理的な意味は異なります。一部の言語ではNULLは何にも等しくないため、if(a == NULL)は常にfalseになります。
したがって、個人的には常にブール値をFALSEに初期化し、1をNULLに初期化することは少し不格好に見えます(Cでも、2つが0であるだけで、単なるスタイルのことです)。
悪い開発者は、コードで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を交換することは問題ありません。ジョエルは彼の最近のポストキャストでそれについて話しました。ただし、ルーチンではブール値とデータを組み合わせて使用しないでください。そうすれば、問題はありません。
Nullは何もない、Falseは少し、0は(おそらく)32ビットです。
PHPの専門家ではありませんが、一部のより最近の言語では、それらを交換することはできません。私は、0とfalseが交換可能であることを少しミスしていますが、ブール値が実際のタイプであるため、それに関連付けられたメソッドとオブジェクトを持つことができるので、それは単なるトレードオフです。Nullはnullですが、本質的には何もありません。
ほとんどすべての現代の言語では、nullは論理的に値を持たないポインタ(または参照)、または初期化されていない変数を指します。0はゼロの整数値、falseは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」が比較インスタンスの単なる文字列ではない理由を私に説明できますか?
$x = 0;
var_dump($x == 'NULL'); # TRUE !!!WTF!!!
php > var_dump((int) "NULL"); // => int(0)
php > var_dump((int) "BLA"); // => int(0)
php.net/manual/en/language.operators.comparison.phpを参照してください。文字列とリソースを数値に変換します。通常の計算
偽りの問題は、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/
null
ときとfalse
。私が使用して好むnull
方法から値を取得する際に、私が使用することができますので、isset
値が代わりに使用するので返されるかどうかを判断するためにempty
:口座に反映されませんこれはfalse
、0
、'0'
または空の文字列は、多くの状況で実行可能な値とすることができます。私にとっては、厄介な構成の中で最もクリーンなソリューションです。