PHP Qu'est-ce que la jonglerie de type?


Exemple

PHP est un langage vaguement typé. Cela signifie que, par défaut, les opérandes d'une expression ne sont pas du même type (ou compatibles). Par exemple, vous pouvez ajouter un numéro à une chaîne et vous attendre à ce qu'il fonctionne.

var_dump ("This is example number " . 1);

Le résultat sera:

string (24) "Ceci est l'exemple numéro 1"

PHP accomplit cela en lançant automatiquement des types de variables incompatibles dans des types permettant à l'opération demandée d'avoir lieu. Dans le cas ci-dessus, il convertit le littéral entier 1 en une chaîne, ce qui signifie qu'il peut être concaténé sur le littéral chaîne précédent. C'est ce qu'on appelle le jonglage de type. Ceci est une fonctionnalité très puissante de PHP, mais c'est aussi une fonctionnalité qui peut vous amener à beaucoup de tracas si vous n'en avez pas conscience et peut même entraîner des problèmes de sécurité.

Considérer ce qui suit:

if (1 == $variable) {
    // do something
}

L'intention semble être que le programmeur vérifie qu'une variable a la valeur 1. Mais que se passe-t-il si $ variable a une valeur de "1 et demi" à la place? La réponse pourrait vous surprendre.

$variable = "1 and a half";
var_dump (1 == $variable);

Le résultat est:

bool (vrai)

Pourquoi est-ce arrivé? C'est parce que PHP s'est rendu compte que la chaîne "1 et demi" n'est pas un entier, mais il doit être pour le comparer à un entier 1. Au lieu d'échouer, PHP lance la jonglerie et tente de convertir la variable en entier. Cela se fait en prenant tous les caractères au début de la chaîne qui peuvent être convertis en entier et en les lançant. Il s'arrête dès qu'il rencontre un personnage qui ne peut pas être traité comme un nombre. Par conséquent, "1 et demi" est converti en entier 1.

Certes, ceci est un exemple très artificiel, mais il sert à démontrer le problème. Les quelques exemples suivants couvriront certains cas où j'ai rencontré des erreurs causées par le type de jonglage qui s'est produit dans un logiciel réel.