Dans le développement quotidien de PHP, nous devons souvent traverser des tableaux ou des objets. Cependant, en raison de la nature de type dynamique de PHP, nous ne pouvons pas toujours nous assurer que les variables entrantes sont dénombrables (c'est-à-dire l'implémentation de l'interface dénombrable ou un tableau). Si vous utilisez Count () directement sur une variable innombrable ou effectuez une traversée FOREAK , elle peut provoquer des erreurs ou des avertissements, en particulier lorsqu'il s'agit de données externes instables.
Pour résoudre ce problème, PHP 7.3 a introduit la fonction is_countable () , qui est utilisée pour déterminer si une variable est dénombrable avant d'appeler Count () . Cela améliore considérablement la robustesse et la tolérance aux pannes du code.
IS_Countable () est une fonction intégrée fournie par PHP 7.3+, qui est utilisée pour déterminer si les variables peuvent être transmises dans la fonction Count () . Le prototype de fonction est le suivant:
<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>
La valeur de retour est une valeur booléenne. Si la variable est un tableau ou si l'interface dénombrable est implémentée, elle renvoie True ; Sinon, il renvoie faux .
Supposons que nous obtenons un ensemble de données d'une API externe et essayons de les traverser:
<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">// Traiter chaque élément</span></span><span>
}
</span></span>
Idéalement, $ data est un tableau ou un objet itérable. Cependant, si l'API renvoie Null , String ou Boolean, le code ci-dessus lancera un avertissement ou une erreur.
Pour éviter cela, nous pouvons utiliser IS_Countable () pour porter des jugements avant de traverser:
<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">// 安全地Traiter chaque élément</span></span><span>
}
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-comment">// Facultatif:Ligner ou traiter le comportement par défaut</span></span><span>
</span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"Types de données innombrables reçus。"</span></span><span>);
}
</span></span>
De cette façon, même si le Null , entier ou d'autres types innombrables retournés, le programme ne se bloquera pas, ce qui améliorera la robustesse du système.
De nombreux développeurs utilisent IS_Array () avant PHP 7.3 pour déterminer s'il peut compter. Bien que cela soit possible dans de nombreux scénarios, il n'identifie pas les objets qui implémentent l'interface dénombrable . Par exemple:
<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>
En ce moment:
<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>
Par conséquent, dans PHP moderne, Is_Countable () doit être utilisé à la place de la logique combinatoire IS_Array () + Count () .
Les vérifications de type sont effectuées sur les entrées externes : en particulier les structures telles que les requêtes de base de données et les réponses API qui peuvent être vides.
Logique de jugement de l'encapsulation unifiée : La vérification IS_Countable () peut être encapsulée en fonction d'outil général pour garder le code soigné.
La combinaison des invites de type et des outils d'analyse statique : tels que le phpstan ou le psaume, peut réduire davantage le risque de type inconnu.
IS_COUNTABLE () est un petit et puissant outil qui nous permet d'être plus à l'aise lorsque vous traitez des structures de données incertaines. Faire bon usage de cette fonction peut non seulement éviter les erreurs d'exécution, mais également écrire des applications PHP plus robustes et plus faciles à entretenir.