2010-07-26 16 views
257

Parece que el operador de PHP == distingue entre mayúsculas y minúsculas? Entonces, ¿hay alguna razón para usar strcmp()? ¿Es seguro hacer algo como:Comparación de cadenas usando == vs strcmp

if ($password == $password2) { ... } 
+8

¿Qué tiene que ver la sensibilidad a mayúsculas y minúsculas con 'strcmp'? – kennytm

+1

@KennyTM: 'strcmp' distingue entre mayúsculas y minúsculas. En algunos idiomas, como VB, la comparación de cadenas puede no serlo, y por lo tanto devolvería un resultado diferente. Este no es el caso en PHP, sin embargo. – cHao

+0

@cHao: '=' en VB distingue entre mayúsculas y minúsculas, también el idioma no. – kennytm

Respuesta

260

La razón de usar es porque strcmp

vuelve < 0 si cadena1 es menor que cadena2; > 0 si str1 es mayor que str2, y 0 si son iguales.

== sólo se devuelve true o false, que no te dice que es el "mayor" cadena.

+9

icic tho en mi caso actual, no necesito saber qué cadena es mayor :) –

+120

strcmp con cuerdas coincidentes tomó 0.207852 segundos strcmp con cadenas sin coincidencia tomó 0.215276 segundos === con cuerdas coincidentes tomó 0.067122 segundos === con no -las cadenas de emparejamiento tomaron 0.057305 segundos http://snipplr.com/view/758/ –

+2

El otro uso de strcmp muestra la clasificación. Para ser más claro sobre la clasificación. strcmp() devuelve <0 si string1 se ordena antes que string2,> 0 si string2 se ordena antes que string1 o 0 si son iguales. Por ejemplo $ string_first = "aabo"; $ string_second = "aaao"; echo $ n = strcmp ($ string_first, $ string_second); devolverá más que cero, ya que aaao está ordenando antes de aabo. –

2

Puede utilizar strcmp() si desea hacer un pedido/lexicographically comparar cadenas. Si solo desea verificar la igualdad, entonces == está bien.

+1

Me gusta en [usort] (http://us2.php.net/manual/en/function.usort.php). De hecho, está hecho para clasificar. – Charles

+0

@Charles Gracias. Wikipedia me hizo vidriar los ojos. – cbednarski

+6

La primera parte es correcta, pero == no está bien para la igualdad. – postfuturist

18

Usar == puede ser peligroso.

Tenga en cuenta que la variable se convertiría en otro tipo de datos si los dos difieren.

Ejemplos:

  • echo (1 == '1') ? 'true' : 'false';
  • echo (1 == true) ? 'true' : 'false';

Como se puede ver, estos dos son de diferentes tipos, pero el resultado es true, que podría no ser lo que el código se esperaría .

Sin embargo, se recomienda utilizar ===, ya que la prueba muestra que es un poco más rápido que strcmp() y su alternativa a las mayúsculas y las minúsculas strcasecmp().

googlear rápida grita esta comparación velocidad: http://snipplr.com/view/758/

+1

A veces los convierte a un tipo diferente incluso si ya tienen el mismo tipo. – Antimony

+0

incluso al comparar dos cadenas que representaban un entero como '" 012 "==" 12 "' php cambió el tipo de ambas cadenas al entero '12 == 12' y luego devolvió' true'. – GoTo

190

Nunca se debe utilizar == de comparación de cadenas. === está bien.

$something = 0; 
echo ('password123' == $something) ? 'true' : 'false'; 

Simplemente ejecute el código anterior y verá por qué.

$something = 0; 
echo ('password123' === $something) ? 'true' : 'false'; 

Ahora, eso es un poco mejor.

+18

== no es solo un problema para diferentes tipos. A veces dará resultados inesperados incluso si ambos lados son una cadena. Pruebe '1e3' == '1000' – Antimony

+3

¿cómo 0 == 'contraseña123'? –

+23

@AndyLobel PHP coacciona 'password123' a un número usando sus extrañas reglas de comparación sueltas ya que el otro operando es un número, esa cadena, como la mayoría, coerces al número 0, y PHP devuelve verdadero para la comparación. – postfuturist

5

strcmp devolverá diferentes valores según el entorno en el que se esté ejecutando (Linux/Windows).

La razón es la que tiene un error como el informe de error dice https://bugs.php.net/bug.php?id=53999

Por favor, manejar con cuidado !! Gracias.

+0

Siempre devolverá 0 si las cadenas son iguales. +1 por tener cuidado acerca de preocuparse por cualquier otro valor que no sea 0. –

90

No utilizar == en PHP. No hará lo que esperas. Incluso si está comparando cadenas con cadenas, PHP las lanzará implícitamente a flotantes y hará una comparación numérica si aparecen numéricas.

Por ejemplo '1e3' == '1000' devuelve verdadero.

+13

Pero puedes simplemente ===. –

+10

@Roman sí, pero muchos programadores de PHP no saben que tienen que hacer eso. De ahí la advertencia. – Antimony

+0

@Antimonio Entonces, ¿por qué no les dices lo que * deberían * hacer en tu respuesta? – Tim

39

Bueno ... de acuerdo con este php bug report, incluso puede obtener 0wned.

<?php 
    $pass = isset($_GET['pass']) ? $_GET['pass'] : ''; 
    // Query /?pass[]= will authorize user 
    //strcmp and strcasecmp both are prone to this hack 
    if (strcasecmp($pass, '123456') == 0){ 
     echo 'You successfully logged in.'; 
    } 
?> 

Le da una advertencia, pero omita la comparación.
Debería estar haciendo === como se sugirió @postfuturist.

+3

Wow +1. Cita del enlace: "Es un comportamiento establecido para la función que recibe el tipo incorrecto de argumento (s) para devolver nulo".Eso es sorprendente teniendo en cuenta que el manual solo dice esto: "Devuelve <0 si str1 es menor que str2;> 0 si str1 es mayor que str2, y 0 si son iguales". Null no se menciona como una posibilidad, sin embargo, en páginas como la página del subprograma se menciona. * suspiro * – Gerry

+0

¿Pero sucede lo mismo cuando el método de formulario se publica ...? – Nikhil

+0

@NikhilGeorge Sí, la función en cuestión aquí es strcmp. No importa contra qué entradas se compara. – r3dsm0k3

29

Recuerde siempre, al comparar cadenas, se debe utilizar === operador (comparación estricta) y no == operador (comparación suelta).

+6

En realidad, creo que es seguro decir que debe usar '===' al comparar * cualquier cosa *. –

3

También La función puede ayudar en la clasificación. Para ser más claro sobre la clasificación. strcmp() devuelve menos de 0 si string1 se ordena antes que string2, mayor que 0 si string2 se ordena antes que string1 o 0 si son iguales. Por ejemplo

$first_string = "aabo"; 
$second_string = "aaao"; 
echo $n = strcmp($first_string,$second_string); 

La función devolverá más que cero, ya que aaao está ordenando antes de aabo.

-4

comparación de cadenas usando strcmp

echo strcmp("my name","my name"); 
+7

Esto no responde la pregunta en absoluto. – Pang

9

Resumiendo todas las respuestas:

  • == es una mala idea para las comparaciones de cadenas.
    Le dará resultados "sorprendentes" en muchos casos. No confíes en eso

  • === está bien, y le dará el mejor rendimiento.

  • strcmp() debe usarse si necesita determinar qué cadena es "mayor", generalmente para operaciones de clasificación.

Cuestiones relacionadas