2009-08-15 10 views
0

Je sais que, par exemple, en utilisant:Faut-il utiliser une comparaison stricte dans Strings?

if (in_array('...'), array('.', '..', '...') === true) 

Plus:

if (in_array('...'), array('.', '..', '...') == true) 

peut augmenter les performances et éviter quelques erreurs courantes (par exemple 1 == true), mais je me demande s'il est une raison d'utiliser des comparaisons strictes sur les chaînes, telles que:

if ('...' === '...') 

semble faire la chose exactement le même que:

if ('...' == '...') 

Si quelqu'un peut apporter de la lumière à ce sujet, je l'apprécie.

Répondre

6

Si vous connaissez les deux valeurs sont garantis pour être des chaînes, puis == et === sont identiques puisque la seule différence entre les deux est que === vérifie si les types sont les mêmes, et pas seulement les valeurs effectives. Cependant, dans certains cas, vous ne savez pas avec certitude qu'une valeur va être une chaîne - par exemple, avec des choses comme les variables $ _GET et $ _POST. Considérez ce qui suit:

$_GET['foo'] == "" 

L'expression ci-dessus évaluera true si foo a été adoptée en tant que chaîne vide, mais il permettra également d'évaluer true si aucune valeur n'a été transmise pour foo du tout. En revanche,

$_GET['foo'] === "" 

ne sera évaluée à true si une chaîne vide a été explicitement adoptée en - sinon la valeur de $_GET['foo'] pourrait être équivalente à une chaîne vide, mais le type ne serait pas car il serait en fait un vide valeur pour cet index, pas une chaîne.

+1

Dans votre exemple, si aucune valeur n'a été transmise à 'foo', vous obtiendrez une erreur de niveau PHP E_NOTICE. –

+0

J'ai compris, merci. –

3

Lorsque vous pouvez utiliser l'un ou l'autre choisir la comparaison stricte parce que:

  1. Il a de meilleures performances
  2. Il empêche des résultats inattendus

Lorsque l'on compare les chaînes vous pouvez toujours avoir des résultats inattendus car une chaîne peut être vide ou une variable que vous pensez être une chaîne ne l'est pas.

Vous n'utiliserez jamais la comparaison de deux littéraux de chaîne car elle peut toujours être réduite à TRUE ou FALSE. Par exemple:

if ('...' === '...') 

est le même que

if (TRUE) 

Donc, puisque vous serez toujours comparer au moins une variable, vous devez supposer que vous pouvez avoir des résultats inattendus.

Vous pouvez voir les résultats de référence de diverses comparaisons strictes vs lâches au http://net-beta.net/ubench/. J'ai également effectué mes propres tests et trouvé les mêmes résultats.Ceci est une micro optimisation, ce qui signifie que vous ne devriez pas changer de code existant car cela ne va pas faire une différence notable, mais si vous écrivez un nouveau code, vous pouvez aussi bien vous entraîner avec les techniques les plus efficaces.

+0

Merci. BTW, ces tests http://net-beta.net/ubench/index.php?t=array10 ne semble pas être équivalent. Vous exécutez ce site? –

+0

Le site est une référence. Je ne le cours pas. [net-beta.net/ubench/](http://net-beta.net/ubench/) est une collection de différents repères. Si vous descendez à equal1 - equal7, vous trouverez les tests de comparaison. Malheureusement, il n'y a pas d'identifiants ou d'ancres nommées dans la page entière, donc je ne peux pas créer de lien vers le groupe de tests spécifiquement. –