PHP条件における厳格な比較と緩い比較
厳密な比較に==を使用すると、値とタイプが同時にチェックされ、==は値を比較する前にタイプ変換を実行します。したがって、0 == 'hello'はtrueです( 'hello'が整数に変換されるため0)が、0 === 'hello'はfalse(異なるタイプ)です。一般的な落とし穴には、「0」== false、1 == '1ABC'、null == 0および[] == falseはすべて真です。特に機能を処理した場合(STRPOSなど)、入力検証(IN_ARRAYでTrueなど)、およびタイプ変換によって引き起こされる予期しない結果を回避するための状態判断の場合、デフォルトで===を使用することをお勧めします。 ==は、型キャストを使用することが明らかに必要な場合にのみ使用されます。そうしないと、コードの信頼性を改善するために、常に厳密な比較を使用する必要があります。
PHPの条件を操作する場合、厳格な比較とゆるい比較の違いを理解することは、信頼性の高いバグのないコードを書くために残酷です。比較中にPHPがタイプジャグリングを処理する方法は、注意しないと予期しない結果につながる可能性があります。

==と===の違いは何ですか?
問題の中核は、あなたが選択したオペレーターにあります:
-
==
(緩い平等):タイプ強制後の値を比較 - PHPは、比較する前にオペレーターを同じタイプに変換しようとします。 -
===
(厳密な平等):値とタイプの両方をチェックします - タイプ変換は実行されません。
これはつまり:

0 == 'こんにちは' // true?はい - intに変換すると「hello」が0になるため 0 === 'hello' // false - 異なるタイプ(int vs文字列)、値も異なります
その最初の行は多くの開発者を驚かせます。なぜ'hello'
が0
に等しいのですか?
PHPが非数量文字列を整数に変換すると、 0
になるためです。したがって、 'hello'
→ 0
、および0 == 0
→ true
。

比較が緩んでいる一般的な落とし穴
ゆるい比較は、直感に反する動作につながる可能性があります。ここにいくつかの古典的な例があります:
'0' == false
→true
'0'
は文字列ですが、ゆるい文脈でブール値として評価されると、false
見なされます。1 == '1abc'
→true
PHPは、文字列が非数字に達するまで解析します。したがって、'1abc'
は1
なります。null == 0
→true
どちらも「falsy」と見なされますが、根本的に異なります。[] == false
→true
空のアレイは大まかにfalse
に等しくなりますが、それはあなたが望むものではないかもしれません。
これらの結果は、フォーム入力、API応答、関数の戻り値など、特定の状態をチェックする場合、ゆるい比較を危険にさらします。
厳密な比較を使用するタイミング
使用===
および!==
ほとんどの場合、タイプと価値の両方を気にするときはいつでも。
例えば:
$ role = getUserrole(); //「管理者」、「ユーザー」、またはnullを返します if($ role == 'admin'){...} //危険 - 1または 'admin'を返す場合はどうなりますか? if($ role === 'admin'){...} //安全 - それが文字列 'admin'である場合にのみ真実
厳密な比較のための他の一般的なユースケース:
strpos()
のような関数からの返品値の確認:if(strpos($ text、 'needle')!== false){...}
!=
ここにバグがあります。針が位置0
にある場合、false
として評価されるためです。入力フィルターの検証:
if($ input === null){...} //本当にnullの場合のみトリガー
in_array()
での作業:in_array( '7'、[1、2、3、4、5、6]、true); //タイプが一致する場合にのみtrue
3番目のパラメーター
true
はStrictモードを有効にします。したがって、'7'
(string)は7
(int)と一致しません。ベストプラクティス
バグを避け、コードの明確さを改善するには:
- firef
===
and!==
デフォルトで- タイプ強制を意図して必要な場合にのみ==
を使用します。 - 入力タイプを早期に検証します- 混合タイプを処理するためにゆるい比較に依存しないでください。
- Falsy Values -
0
、''
、null
、false
、[]
、および'0'
はすべて、ゆるい文脈で同様に動作します。 -
スイッチで厳格な比較を使用します。
switch
デフォルトでゆるい比較を使用しますが、ロジックをシンプルに保ち、タイプジャグリングに依存しないようにします。
結論:ゆるい比較にはその場所がありますが、それらは微妙なバグの地雷です。疑わしい場合は、厳格にしてください。より予測可能で、デバッグが簡単で、意図を明確にします。
基本的に、PHPのタイプの強制に依存していない場合は、
===
を使用する必要があります。以上がPHP条件における厳格な比較と緩い比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。
- firef

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











短絡評価は、PHPのロジック演算子の重要な機能であり、パフォーマンスを改善し、エラーを回避できます。 1. &&を使用する場合、左オペランドが偽の場合、右オペランドはもはや評価されません。 2。||を使用する場合、左オペランドが真である場合、右オペランドがスキップされます。 3.空のオブジェクト呼び出しを避けるために、($ user && $ user-> haspermission( 'edit'))の場合など、オブジェクトメソッドを安全に呼び出すために使用できます。 4.高価な機能呼び出しをスキップするなど、パフォーマンスを最適化できます。 5。デフォルト値を提供できますが、|| Falsy Valuesに敏感で、使用できますか?代わりにオペレーター。 6.キー操作が短絡されていないことを確認するために、スキップされる可能性のある右側に副作用を避けないでください。ただ

useearlylylyrylrylyryturnStohandlepreconditionSandElimatedeepnestingbyExitingfainfailurecases.2.validateallconditionsupfrontusingededectedhelpermethodtokeeptheeptheptheptheptheptestestable.3.CentralizevalidationWithexectionsry/catchblockstomainanablat、l

通常、スイッチはif-elseif-elseよりも高速です。特に5つ以上の個別の値があり、PHPを最適化してテーブルをスキップできる場合。 2。if-elseifは、複雑または範囲の状態の判断により適しています。 3. 2つのパフォーマンスは、少数の条件(1〜3)の場合に類似しています。 4. Opcacheをオンにして、スイッチの最適化の機会を改善します。 5.コードの読みやすさが推奨されており、単純なマッピングシナリオでPHP8.0マッチ式を使用することをお勧めします。

厳密な比較に==を使用すると、値とタイプを同時にチェックし、==は値を比較する前にタイプ変換を実行します。したがって、0 == 'hello'はtrueです( 'hello'が整数に変換されるため0)が、0 === 'hello'はfalse(異なるタイプ)です。一般的なトラップには、「0」== false、1 == '1ABC'、null == 0および[] == falseはすべて真です。特に関数の戻り値(STRPOSなど)、入力検証(IN_ARRAYの3番目のパラメーターなど)、およびタイプ変換によって引き起こされる予期しない結果を回避するための状態判断の場合、デフォルトで===を使用することをお勧めします。 ==は明らかに==を使用する必要がある場合にのみ使用されます。

ガード条項と早期リターンを使用すると、コードの読みやすさと保守性を大幅に向上させることができます。 1.ガード条項は、関数の開始時に無効な入力条件または境界条件を確認し、早期のリターンを迅速に終了するための条件付き判断です。 2。それらは、ネストレベルを下げ、コードを平らにして線形化し、「ピラミッドの不運」を避けます。 3.利点には、営巣の深さを減らし、意図を明確に表現し、他の枝を減らし、テストを促進することが含まれます。 4.入力検証、ヌル値チェック、許可制御、空の収集処理などのシナリオで一般的に使用されます。 5.ベストプラクティスは、関数開始部分に焦点を当てて、基本から特定に順番にチェックを手配することです。 6.プロセスの混乱を引き起こしたり、リソースクリーニングを必要とする言語でリソースの漏れを引き起こす長い関数で過剰に使用したりしないでください。 7。中核原則は次のとおりです。できるだけ早く確認し、できるだけ早く返送してください

動的機能フラグの保守可能な実装は、構造化された、再利用可能な、およびコンテキスト対応のロジックに依存しています。 1.一流の市民としての関数フラグの構造定義、メタデータおよび活性化条件を中心的に管理および伴う。 2。柔軟性を向上させるために、ランタイムコンテキスト(ユーザーロール、環境、グレースケール比など)に基づいて動的評価が実行されます。 3。抽象的な再利用可能な条件判断関数、役割、環境、テナントマッチング、グレースケールリリースなど、重複したロジックを回避します。 4.オプションで、外部ストレージからフラグ構成をロードし、再起動の変更をサポートします。 5.コードを明確に保つために、カプセル化またはフックを介してビジネスロジックからフラグのチェックを切り離します。最終的に、安全なリリース、クリアコード、高速実験、柔軟なランタイムコントロールの目標を達成します。

PHP8を使用して、式を一致させて長いIF-ELSEチェーンを置き換えると、コードセキュリティと読みやすさを改善できます。 1.条件が単一の変数に基づいており、厳密に比較されていることを確認してください。 2。各ブランチを構文に一致させるように変換し、タイプの一貫性に注意してください。 3.弦や整数などのタイプの不一致の問題。 4.多値のマージ分岐は、Php8.1で使用できます。 5.一致(TRUE)モードは、複雑なロジックに使用できます。ただし、論理が複雑な場合は、非スカラー値を含む、またはゆるい比較が必要な場合は、if-elseを保持する必要があります。移行の場合、小さな状態マッピングから開始し、テストおよび静的分析ツールと協力して、すべての状況がカバーされ、最終的にはより簡潔で信頼性の高いコード構造を実現する必要があります。

YodaconditionSareMostlyArelicofThePast、butstillhavelimitedalidivityspecificContexts; theoriginatedtopreventacceventAssignmentBugs、suthasif($ nessif = 42)、byreversingtheodrytoif(42 === $ $ nesss)、causesafatalerif = nistmistakenlysly;
