Dans PHP, SetType () est une fonction de conversion de type très pratique qui peut modifier le type d'une variable in situ. Cependant, lorsque nous utilisons SetType () pour convertir une valeur en type booléen ( bool ), nous pouvons rencontrer des problèmes faciles à ignorer mais qui ont un impact important, en particulier lorsque vous traitez les entrées utilisateur ou les données externes.
Cet article se concentrera sur le comportement de SetType ($ var, «bool») et analysera les malentendus et les précautions possibles.
Tout d'abord, jetons un coup d'œil à un exemple de base:
$var = 1;
settype($var, 'bool'); // Maintenant $var Oui true
Ceci est intuitif: les nombres non nuls sont convertis en vrai et 0 est converti en faux . De même, les chaînes non vides deviendront également vraies et les cordes vides deviendront fausses :
$var = 'hello';
settype($var, 'bool'); // true
$var = '';
settype($var, 'bool'); // false
À première vue, tout semble raisonnable, mais le problème est précisément caché dans ces "raisonnables".
L'une des situations les plus déroutantes est:
$var = 'false';
settype($var, 'bool'); // 结果Oui true
De nombreux débutants ou des personnes qui ont été transférés d'autres langues (comme JavaScript, Java) sont enclins à penser que la chaîne "fausse" devrait correspondre à la valeur booléenne fausse , mais en php, tant que la chaîne n'est pas vide, c'est vrai . Il s'agit d'un piège typique.
Surtout lors du traitement du formulaire Entrée:
$input = $_POST['subscribe']; // L'utilisateur peut avoir soumis "false"
settype($input, 'bool');
À ce stade, l'entrée sera en fait convertie en vrai car il s'agit d'une chaîne non vide. Cela peut entraîner des erreurs de jugement logique.
Une autre chose qui est facilement négligée est les tableaux et les objets:
$var = [];
settype($var, 'bool'); // false
$var = [1];
settype($var, 'bool'); // true
Un tableau vide est faux , mais même s'il n'y a qu'un seul élément, c'est vrai . Cela peut provoquer une erreur de jugement lors de la traversée ou de la vérification des données.
De même, un objet est toujours vrai , même s'il n'y a pas de propriétés dans l'objet:
$var = new stdClass();
settype($var, 'bool'); // true
Lorsque la variable est nul , setType () se convertit en false , ce qui est également comme prévu:
$var = null;
settype($var, 'bool'); // false
Cependant, il convient de noter que la combinaison d' ISSet () et de SetType () ne peut pas remplacer la vérification du type. Par exemple, vous écrivez ceci:
if (isset($_GET['active'])) {
$active = $_GET['active'];
settype($active, 'bool');
}
Si $ _get ['actif'] est '0' (c'est-à-dire une chaîne), il sera converti en vrai car '0' est une chaîne non vide. La bonne façon de le faire explicitement:
$active = isset($_GET['active']) && $_GET['active'] === '1';
Ou faites une analyse plus sûre basée sur le contexte, comme la cartographie explicite des chaînes aux valeurs booléennes.
Mélanger setType () avec if ($ var) peut entraîner le flou de la sémantique de code. Par exemple:
$val = $_GET['debug'] ?? '';
settype($val, 'bool');
if ($val) {
// Activer le mode de débogage
}
Ce code semble juste à la surface, mais il est en fait difficile à maintenir et à lire. Il vaut mieux utiliser une liste blanche explicite:
$debug = in_array($_GET['debug'] ?? '', ['1', 'true'], true);
C'est plus clair, contrôlable et plus sûr.
Lorsque vous traitez avec les conversions booléennes, en particulier la saisie des utilisateurs ou des URL, il est recommandé d'éviter settingType () . Envisagez d'utiliser une logique de jugement plus explicite ou d'encapsulant une fonction de transformation:
function toBool($value): bool {
$truthy = ['1', 1, true, 'true', 'on', 'yes'];
return in_array(strtolower((string)$value), $truthy, true);
}
Puis utilisez:
$flag = toBool($_GET['flag'] ?? '');
Cela peut mieux empêcher les erreurs de jugement et améliorer la maintenabilité et la prévisibilité du code.
SetType () semble simple en PHP, mais il est facile de provoquer un comportement inattendu lors de la conversion des valeurs booléennes. Les questions courantes comprennent:
La chaîne "false" est convertie en vrai
La différence de comportement entre la chaîne vide et '0'
Les valeurs booléennes par défaut des tableaux et des objets ne sont pas intuitifs
Il est facile de provoquer des vulnérabilités logiques lors de la coopération avec la saisie de l'utilisateur
Par conséquent, il est recommandé d'utiliser SetType () avec prudence pour la transformation booléenne, en particulier lors du traitement des données de l'extérieur, un jugement explicite ou l'encapsulation de fonctions plus sûres doit être utilisée pour améliorer la robustesse du code.
Pour démontrer un code spécifique pour ces situations ou pour créer un outil de test, vous pouvez vous référer à https://gitbox.net/tools/php-bool-test .