PHPのベビーベッド:FALSE、NULL、およびそれらに関連付けられた値


PHPでは、 FALSE値とNULL値、およびそれらに関連付けられた値は、他の言語で通常使用されている値とは異なり、独自の非自明な機能を備えています。
この記事では、これらの機能について説明します。
初心者にとって、これは、経験のある読者にとって、全体像の可視性に役立ちます-ニュアンスが私の頭から飛び出した場合、メモリを更新します。


If式のFALSE


PHPドキュメントによると、 boolean型にキャストした後次の値はFALSEです。
これは、そのような値が条件に渡される場合:
 if (…) echo1”; else echo0”; 

文字列"0"が表示されます。

変数の値が設定されていない場合( unset )、警告も発行される場合があります。 @変数の前に書き込むことで、条件の警告を削除できることを思い出してください。

例:

 if (@$undefVar) { …} 

しかし、よく考えて、他に適切なオプションがない場合は、極端な場合にのみ@を使用する必要があります。 isset()関数を参照してください。

is_null()関数と言語構成体isset()およびempty()


IS_NULLは()戻りTRUEのみ任意の値を割り当てられていないか、に設定された変数にNULL
isset()は、 is_null()と比較して1対1の反対のブール値を返します。
変数が設定されていない場合は、 is_null()も警告与え«Undefined variable»とは異なり、 isset()警告を発行しません。
変数の値を削除するには、 unset()関数を使用できることを思い出してください。 この目的のためにNULL設定して、変数値を読み取ろうとする際のコンパイラーの警告を回避することもできます。

変数とは異なり、定数を使用するには、 defined()構造を使用する必要があることに注意してください。

empty()を使用すると、すべてが単純になりFALSE真の値に対してはTRUEを返し、その他のすべてに対しては、ドキュメンテーションから取得した上記のリストに完全に従います 。 ところで、自分で実験する人のために、変数のみを引数としてempty()渡すことができます。 定数を渡そうとすると、コンパイラは構文エラーを生成します。

配列のインデックス付け


すべての偽の値の配列で作業する場合は、単一の要素に適用されます。
唯一の例外は、インデックス値に空白行(されている'' )とNULL -これら2つの値のためには、別のメモリの代わりに使用されます。
また、空の配列array()の値は、他の配列と同様に配列インデックスにすることはできません-コンパイラは警告«Illegal offset type»を生成し、そのようなインデックスに対応する値は設定されません。

空の文字列とNULLのインデックスを配列内の異なる要素に対応させるには、次のアプローチを使用できます。 機能について説明します。

 function index($var) { if ($var === NULL) return 'NULL'; return 'V' . $var; } 


さらに、値を設定するときに、空の文字列とNULL値の個別のインデックスを取得します。より正確には、さまざまなインデックスをエミュレートします。
 $arr[index('')]='value for empty string '; $arr[index(NULL)]='value for NULL'; 


配列インデックスは別のトピックです。 一例を与えるために、整数インデックスの値こと$arr[555] strokovymuインデックスに対応する値と一致$arr['555']配列内。

このような機能は、主に配列のインデックスが整数または文字列であるという事実に関連しています。 より詳細な情報は、PHPマニュアルの配列タイプの説明にあります

文字列表現



偽の定数の文字列表現を考えます。
たとえば、連結する場合、値は次の表に示す次の行に変換されます。

価値ひも
(空白)
00
0.00
「」(空白)
「0」0
配列()配列
ヌル(空の行)
@ $ undef(空白)


文字列への変換のトピックについては、公式Webサイトの「 文字列へ変換」セクションで詳しく説明しています

比較演算子


比較演算子に渡します。
値と比較した場合、すべての偽の値は、予想通り、trueを返しFALSE 「演算子を使用して== 」。
しかし、偽の文字列定数を互いに比較するとき、推移性に依存するべきではありません。
偽の値を比較する完全なテーブルを示します(プラスは、「 != 」演算子を使用して比較すると真の値を返すテーブルの要素を示します。
!=00.0「」「0」配列()ヌル@ $ undef
0+
0.0+
「」++
「0」++++
配列()++++
ヌル+
@ $ undef+


$undef値が割り当てられていない変数

表から、いくつかの素晴らしい結論を引き出すことができます。
1.文字列のみを使用することがわかっている場合、それらを簡単に比較でき、 "" (空の文字列)が"0"等しくなることを心配する必要はありません。
2.配列が文字列、整数、実数と等しくなることはありません。

様々な偽の定数の種類が異なるため、これらを区別するために、あなたは、オペレータのペアを使用することができます===!==
===演算子は、偽の値のすべてのペアに対して偽の値を返します。
NULL値を割り当てられているそのうちの一つの引数、のために真の値を返し、2番目は値が割り当てられていません。

NULL変数と未定義変数の違い



===演算子を使用すると、値が割り当てられていない変数とNULL値を持つ変数を除き、すべての偽の値を区別できます。

このような変数は、 get_defined_vars()関数を使用して区別できます。

変数$var値が割り当てられているかどうかを判断する必要がある場合は、次のコードフラグメントを使用できます。
 if (array_key_exists('var', get_defined_vars()) ) { echo "var is defined"; // $var is assigned NULL } else { echo "var is NOT defined"; // $var is not defined or unset($var) was called } ($のVAR)が呼ばれました if (array_key_exists('var', get_defined_vars()) ) { echo "var is defined"; // $var is assigned NULL } else { echo "var is NOT defined"; // $var is not defined or unset($var) was called } 


結論


PHPでは、2つの偽の値が等しくない可能性があり、一見異なる変数は、比較すると同じになることがあることを常に覚えておく必要があります。 このような驚きを避けるために、 ===および!==演算子を使用できます。

配列を操作するとき、驚きを避けるために、値を保証された異なるインデックスに変換する関数を書くことができます。 その後、その助けを借りてのみ配列の要素にアクセスします。 これによりプログラムの速度が低下する可能性がありますが、驚きを避けるのに役立ちます。

テストはPHP 5.3.1で実施されました。

サイトリンク


1. タイプの比較表オプションのPHP
2. PHPの文脈でのMySQLのNULLと空の文字列

Source: https://habr.com/ru/post/J113253/


All Articles