毎日のPHP開発では、多くの場合、配列またはオブジェクトを通過する必要があります。ただし、PHPの動的なタイプの性質により、着信変数がカウント可能であること(つまり、可算インターフェイスまたは配列を実装する)を常に保証することはできません。 Count()を数え切れない変数で直接使用する場合、またはforeachトラバーサルを実行すると、特に不安定な外部データを処理する場合、エラーや警告を引き起こす可能性があります。
この問題を解決するために、PHP 7.3はIS_Countable()関数を導入しました。これは、 Count()を呼び出す前に変数がカスタントできるかどうかを判断するために使用されます。これにより、コードの堅牢性とフォールトトレランスが大幅に向上します。
is_countable()は、変数をcount()関数に渡すことができるかどうかを判断するために使用されるphp 7.3+によって提供される組み込み関数です。関数プロトタイプは次のとおりです。
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">is_countable</span></span><span>(</span><span><span class="hljs-keyword">mixed</span></span><span> </span><span><span class="hljs-variable">$value</span></span><span>)
</span></span>
返品値はブール値です。変数が配列であるか、可算インターフェイスが実装されている場合、 trueを返します。それ以外の場合、それはfalseを返します。
外部APIからデータのセットを取得し、それを通過しようとするとします。
<span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">get_data_from_api</span></span><span>();
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$item</span></span><span>) {
</span><span><span class="hljs-comment">// 各アイテムを処理します</span></span><span>
}
</span></span>
理想的には、 $データは配列または反復可能なオブジェクトです。ただし、APIがnull 、文字列、またはブール値を返す場合、上記のコードに警告またはエラーが発生します。
これを回避するために、raversingの前にis_countable()を使用して判断を下すことができます。
<span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">get_data_from_api</span></span><span>();
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_countable</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>)) {
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$item</span></span><span>) {
</span><span><span class="hljs-comment">// 安全地各アイテムを処理します</span></span><span>
}
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-comment">// オプション:デフォルトの動作を記録または処理します</span></span><span>
</span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"受信できないデータ型。"</span></span><span>);
}
</span></span>
このように、返されたnull 、整数、またはその他の数え切れないタイプがたとえあっても、プログラムはクラッシュしません。これにより、システムの堅牢性が向上します。
多くの開発者は、php 7.3の前にis_array()を使用して、カウントできるかどうかを判断します。これは多くのシナリオで可能ですが、可算インターフェイスを実装するオブジェクトを識別しません。例えば:
<span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">MyCollection</span></span><span> </span><span><span class="hljs-keyword">implements</span></span><span> </span><span><span class="hljs-title">Countable</span></span><span> {
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">count</span></span><span>(</span><span><span class="hljs-params"></span></span><span>): </span><span><span class="hljs-title">int</span></span><span> {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-number">0</span></span><span>;
}
}
</span><span><span class="hljs-variable">$collection</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">MyCollection</span></span><span>();
</span></span>
現時点では:
<span><span><span class="hljs-title function_ invoke__">is_array</span></span><span>(</span><span><span class="hljs-variable">$collection</span></span><span>); </span><span><span class="hljs-comment">// false</span></span><span>
</span><span><span class="hljs-title function_ invoke__">is_countable</span></span><span>(</span><span><span class="hljs-variable">$collection</span></span><span>); </span><span><span class="hljs-comment">// true</span></span><span>
</span></span>
したがって、最新のPHPでは、 IS_Array() + count()コンビナトリアルロジックの代わりにIS_Countable()を使用する必要があります。
タイプチェックは外部入力で実行されます:特に、空になる可能性のあるデータベースクエリやAPI応答などの構造。
統一されたカプセル化判断ロジック: is_countable()チェックは、コードをきれいに保つための一般的なツール関数としてカプセル化できます。
タイプのプロンプトと静的分析ツールを組み合わせると、phpstanや詩編などは、未知のタイプのリスクをさらに減らすことができます。
IS_Countable()は、不確実なデータ構造に対処するときに、より快適にすることができる小さくて強力なツールです。この関数を適切に使用すると、ランタイムエラーを回避するだけでなく、より堅牢で容易なPHPアプリケーションを書き込むこともできます。