これは、一部のプログラミング言語では特殊なケースのようです。PHPのマニュアルでは、意味がわかりません。
(false !== ($file = readdir($handle)))
右側に「代入」、左側に「比較」がありますが、演算子全体とはどういう意味ですか?
これを使用する際に特別な考慮事項はありますか?
これは、一部のプログラミング言語では特殊なケースのようです。PHPのマニュアルでは、意味がわかりません。
(false !== ($file = readdir($handle)))
右側に「代入」、左側に「比較」がありますが、演算子全体とはどういう意味ですか?
これを使用する際に特別な考慮事項はありますか?
これは、次の省略形です。
$file = readdir($handle);
if (false !== $file) {
// etc
}
これは、while ループの条件として最もよく見られます。注意すべき点が 2 つあります。
編集OPの質問に応えて:
PHP には、「緩やかな」値チェックと「厳密な」値チェックの両方があります。緩いチェックでは == および != 演算子を使用し、「真実」と「偽」の値を比較します。False、0、または空の文字列または配列はすべて「false」であるため、条件 ("" == false) は true と評価され、(0 == Array()) も同様です。
厳密なチェックでは、=== と !== を使用します。これは、テストされる変数が同一でなければならないことを意味するため、(0 === false) は false と評価され、(0 === 0) は true と評価されます。
これが readdir 関数にとって何を意味するかを説明するために、マニュアル ページにはそれを説明する大きな赤いボックスがあります。
これは、基本的に 2 つのステートメントを 1 つにまとめたものです。
$file = readdir($handle);
if($file !== false)
{
//do something
}
特に特別なケースではありません。
PHP は readdir() 関数を実行し、結果を $file 変数に代入しようとします。readdir() が成功した場合、$file にはディレクトリの値が含まれます。ただし、失敗した場合は、ブール値の false が含まれます。したがって、PHP は readdir() を実行し、結果が false かどうかをテストします...比較テストの左の値としての false は、単にスタイル上の機能です。
よく見かけます
if (false == $x)
それよりも
if ($x == false)
比較を行うとき。どちらもまったく同じことを行いますが、
if (false = $x)
比較演算子を間違って入力すると、通知がスローされます (エラー ログが有効になっている場合)。
if ($x = false)
通知は表示されず、おそらく意図されていない $x に false の値が割り当てられ、コードに問題やバグが発生する可能性があります
分解:
$file = readdir($handle);
if ($file !== false) {
}
のPHPマニュアルから引用readdir
:
この関数はブール値の FALSE を返す場合がありますが、FALSE と評価される非ブール値を返す場合もあります。詳細については、ブール値のセクションを参照してください。この関数の戻り値をテストするには、=== 演算子を使用します。
if (false !== ($file = readdir($handle)))
という意味です
$file = readdir($handle) が値 NULL を返し、次のコードがある場合:
if (false !== ($file = readdir($handle))) {
//do something
}
NULL は false ではないため、「何かをする」が実行されます。
$file が 0 を返す場合 - 0 は false ではないため、"何かを実行" が実行されます。
$file が値 false を返す場合、"何かを実行" は実行されません。
代わりにこのコードがある場合: (1 つ少ない = 演算子)
if (false != ($file = readdir($handle))) {
//do something
}
意味は次のとおりです。
NULL は false と評価されるため、「何かを行う」は実行されません。
$file が 0 を返す場合、0 は false と評価されるため、"何かを実行" は実行されません。
$file が値 false を返す場合、"何かを実行" は実行されません。
上記は、!== 演算子がどのように機能するかを説明するためのものです。readdir() 関数は、これらの値 (null、0、false) のすべてを返すわけではありません。