Comparación de cadenas usando ‘==’ o ‘===’ frente a ‘strcmp()’

6 minutos de lectura

avatar de usuario
Jiew Meng

Parece que PHP === El operador distingue entre mayúsculas y minúsculas. Entonces, ¿hay alguna razón para usar strcmp()?

¿Es seguro hacer algo como lo siguiente?

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

  • ¿Qué tiene que ver la distinción entre mayúsculas y minúsculas con strcmp?

    – kennytm

    26 de julio de 2010 a las 8:50

  • @KennyTM: strcmp distingue entre mayúsculas y minúsculas. En algunos lenguajes, como VB, la comparación de cadenas puede no serlo y, por lo tanto, arrojaría un resultado diferente. Sin embargo, este no es el caso en PHP.

    – chao

    26 de julio de 2010 a las 8:56

  • @jie: Es posible que desee utilizar === en vez de == porque '0XAB' == '0xab' es verdad.

    – kennytm

    26 de julio de 2010 a las 9:01

  • usar === en lugar de == es importante, porque comparar cualquier cadena con 0 con == devolverá verdadero, lo que obviamente es falso…

    – Karl Adler

    27 de enero de 2013 a las 8:37

  • @Kenny También ‘0xAB’ == ‘171’

    – Antimonio

    1 de diciembre de 2014 a las 6:52


avatar de usuario
deceze

La razón para usarlo es porque strcmp

devuelve 0 si str1 es mayor que str2, y 0 si son iguales.

=== solo regresa true o falseno te dice cuál es la cadena “mayor”.

  • icic aunque en mi caso actual, no necesito saber qué cadena es mayor 🙂

    – Jiew Meng

    26 de julio de 2010 a las 9:11

  • strcmp con cadenas coincidentes tomó 0.207852 segundos strcmp con cadenas no coincidentes tomó 0.215276 segundos === con cadenas coincidentes tomó 0.067122 segundos === con cadenas no coincidentes tomó 0.057305 segundos snipplr.com/view/758

    usuario503853

    22/04/2013 a las 17:00

  • El otro uso de strcmp muestra la clasificación. Para ser más claro sobre la clasificación. strcmp() devuelve 0 si cadena2 se ordena antes que cadena1 o 0 si son iguales. Por ejemplo $cadena_primero = “aabo”; $cadena_segundo = “aaao”; echo $n = strcmp($cadena_primero,$cadena_segundo); devolverá mayor que cero, ya que aaao está ordenando antes que aabo.

    – Hombre HTML

    16/08/2013 a las 18:00

  • ¿Por qué esta respuesta obtiene la mayor cantidad de votos a favor? Estoy votando a la baja porque aunque es la respuesta que merece esta pregunta, pero no la respuesta ‘correcta’. La respuesta correcta debería ser ‘Usar ===’ como mucha gente ya dijo en otras respuestas.

    – onur güngör

    8 de noviembre de 2013 a las 8:14

  • @onur güngör En realidad, esto lo hace responde la pregunta del operador, que es So is there any reason to use strcmp() ?, mientras que la respuesta de Postfuturist no. Oh, diablos… ninguna respuesta pareció compilar de inmediato la usar de strcmp()la actuación de ===y el mala confiabilidad de == para comparaciones de cadenas… así que agregué el mío a la lista.

    – Balmipour

    31 de agosto de 2017 a las 17:19

Nunca debes usar == para la 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.

  • == no es solo un problema para diferentes tipos. A veces dará resultados inesperados incluso si ambos lados son una cadena. Prueba ‘1e3’ == ‘1000’

    – Antimonio

    21 de junio de 2012 a las 1:54

  • ¿Cómo funciona 0 == ‘contraseña123’?

    –Andy Lobel

    10 de agosto de 2012 a las 2:41

  • @AndyLobel PHP obliga a ‘contraseña123’ a un número usando sus extrañas reglas de comparación ya que el otro operando es un número, esa cadena, como la mayoría, obliga al número 0, y PHP devuelve verdadero para la comparación.

    – posfuturista

    10 de agosto de 2012 a las 5:15

  • Un rápido var_dump((int)’password123′); me ayudó a comprender completamente por qué sucedió esto… **vergüenza**… Realmente me gusta el operador ===

    – Carlton

    8 de noviembre de 2012 a las 11:49

  • esto se debe a que usar ‘==’ si uno de los dos operandos se puede convertir en número, php convierte ambos operandos en números, y más, si una cadena no numérica se convierte en número, toma el valor cero, lo que resulta igual a cero, por lo que el resultado de la comparación con simple ‘==’ puede algo no deseado

    –Luca C.

    1 de agosto de 2014 a las 6:29

avatar de usuario
Antimonio

no usar == en PHP. No hará lo que esperas. Incluso si está comparando cadenas con cadenas, PHP implícitamente las convertirá en flotantes y hará una comparación numérica si parecen numéricas.

Por ejemplo '1e3' == '1000' devuelve verdadero. Deberías usar === en cambio.

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

    – Antimonio

    25 de enero de 2013 a las 4:36

  • @Animony Entonces, ¿por qué no decirles lo que debería hacer en tu respuesta?

    – Tim

    8 de marzo de 2018 a las 16:19

avatar de usuario
Ajith

Bueno… según esto Informe de errores de PHPincluso puedes conseguir propiedad de 0.

<?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 aún así omite la comparación. deberías estar haciendo === como sugirió @postfuturist.

avatar de usuario
Sacerdote de datos

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

  • En realidad, creo que es seguro decir que deberías usar === al comparar cualquier cosa.

    – asistente.de.pista.6

    9 junio 2015 a las 22:37

avatar de usuario
Pedro Mortensen

Resumiendo todas las respuestas:

  • == es un mala idea para comparaciones de cadenas.

    Te 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.

  • En realidad, creo que es seguro decir que deberías usar === al comparar cualquier cosa.

    – asistente.de.pista.6

    9 junio 2015 a las 22:37

avatar de usuario
Nikolá Petkanski

Usando == podría ser peligroso.

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

Ejemplos:

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

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

Usando ===sin embargo, se recomienda ya que la prueba muestra que es un poco más rápido que strcmp() y su alternativa que no distingue entre mayúsculas y minúsculas strcasecmp().

Una búsqueda rápida en Google grita esta comparación de velocidad: http://snipplr.com/view/758/

  • A veces los convierte en un tipo diferente incluso si ya tienen el mismo tipo.

    – Antimonio

    25 de abril de 2013 a las 5:24

  • incluso al comparar dos cadenas que representaban un número entero como "012" == "12" php cambió el tipo de ambas cadenas a entero 12 == 12 y luego regresó true.

    – Ir

    23/09/2014 a las 18:09

  • @GoTo: ¿No cambió eso en alguna versión posterior de PHP?

    -Peter Mortensen

    17/09/2021 a las 20:20


  • @PeterMortensen Ni idea. Actualmente no escribo PHP.

    – Ir

    18 sep 2021 a las 11:39

¿Ha sido útil esta solución?