80 votes

Pourquoi fait 1234 == ' 1234 tester ' avoir la valeur true ?

<blockquote> <p><strong>Doublon possible :</strong><br> <a href="http://stackoverflow.com/questions/589549/php-vs-operator">php vs de == === opérateur</a> </p> <p>Une réponse facile pour quelqu'un, je suis sûr. Quelqu'un peut-il expliquer pourquoi cette expression prend la valeur true ?</p><pre><code></code></pre></blockquote>

95voto

Lucas Green Points 2993

Parce que vous utilisez l’opérateur == (similitude) et PHP est le fait de contraindre la chaîne en int.

Pour le résoudre utilisation le === (op_Equality), qui vérifie non seulement si la valeur est la même, mais aussi si le type de données est le même, donc la chaîne « 123 » et int 123 ne sera pas considérées égales.

77voto

Lusitanian Points 6910

En PHP et JavaScript, qui a un comportement légèrement différent), l'opérateur de comparaison == fonctionne différemment que dans la fortement typées langages comme le C ou le Java. L' === opérateur a le comportement que vous pouvez probablement s'attendre. Ci-dessous la répartition des deux opérateurs de comparaison tels qu'ils s'appliquent à PHP.

==

Cet opérateur est officiellement connu sous le nom de "l'égalité" de l'opérateur, même si ça ne correspond vraiment pas à la définition usuelle du mot "égalité". C'est ce qui est connu comme un type de jonglerie de comparaison. Si les types des deux opérandes ne correspondent pas (dans votre exemple, 1234 a un entier et d' 1234 test est une chaîne de caractères), PHP va implicitement exprimés les opérandes de chaque autres types et de tester l'égalité de la nouvelle-valeurs typées comme indiqué ci-dessous:

<?php
var_dump( (int) 'hi' ); // int(0)
var_dump( (string) 0 ); //string("0")
var_dump( 'hi' ==  0 ); // bool(true)

var_dump( (int) '1hi' ); // int(1)
var_dump( 1 == '1hi' ); // bool(true)

Il a une contrepartie (type de jonglerie) opérateur d'inégalité, !=.

===

L' === opérateur, connu comme le "identiques" opérateur effectue un contrôle strict de la valeur et le type de chacun des opérandes et de ne pas effectuer les conversions implicites. Par conséquent, "0" ne === 0 et "1234 test"ne === 1234.

<?php
var_dump( '1234 test' === 1234 ); // bool(false)

Il a une contrepartie (strict) opérateur d'inégalité, !==.

Bizarreries

Notez que l' === opérateur a un comportement sur des objets qui est considéré comme étrange par certains. Dire que nous avons class A et les variables $a et $b tel que défini ci-dessous:

<?php
class A { 
  public $property = 'default value';
}
$a = new A();
$b = new A();

Vous vous en doutez var_dump($a === $b); sortie bool(true). Elle retourne false. Lorsque utilisé sur les objets, l'opérateur fait vérifie si les deux opérandes sont des références pour le même objet. L' == de l'opérateur, dans ce cas, les œuvres de la vérification des propriétés de l'objet, de sorte que $a == $b.

Manuel PHP Liens

28voto

Niet the Dark Absol Points 154811

Lors de la conversion d’une chaîne à un entier, tous les caractères numériques jusqu’au premier caractère non numérique devient le nombre. Ainsi devient car l’espace n’est pas un caractère numérique.

Ainsi``

Si vous voulez forcer une comparaison de chaînes, vous devriez effectuer un cast en string :

8voto

Andrew Vaughan Points 146

Vous êtes vaguement de la comparaison de deux différents types de données (un entier et une chaîne de caractères). PHP dispose d'une très détaillé graphique de la façon dont les comparaisons travail dans leur système lors de l'utilisation de la loose de comparaison opérateur binaire (==):

http://php.net/manual/en/types.comparisons.php

Si vous voulez vous assurer que les types sont également dans la synchronisation, c'est qu'ils sont tous les deux des entiers ou des deux cordes, d'utiliser le type de l'opérateur de comparaison (===).

Notez que, lors de l'utilisation de cet opérateur, ce sera aussi le retour de faux:

1234 === '1234'

Si vous n'êtes pas sûr de vos types lors de la comparaison, vous pouvez le couple le plus fort-type de comparaison avec PHP typecasting:

$a = 1234;
$b = '1234';

if ($a === $b) { }            // Will not fire, as it is false
if ((int)$a === (int)$b) { }  // Will fire, as it is true

4voto

Ray Points 12928

Égal à double dira php pour analyser un int de la chaîne. La chaîne évaluera à l’entier 1234. Utilisez la méthode equals triples ' ===' pour obtenir une comparaison exacte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X