php - strings - Comparación de cadenas utilizando== vs. strcmp
php string contains (12)
Resumiendo todas las respuestas:
==
es una mala idea para las comparaciones de cadenas.
Te dará resultados "sorprendentes" en muchos casos. No confíes en ello.===
está bien, y le dará el mejor rendimiento.strcmp()
debe usarse si necesita determinar qué cadena es "mayor", normalmente para las operaciones de clasificación.
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:
if ( $password === $password2 ) { ... }
¡strcmp devolverá valores diferentes según el entorno que esté ejecutando (Linux / Windows)!
La razón es que tiene un error, como dice el informe de errores https://bugs.php.net/bug.php?id=53999
Por favor, maneja con cuidado !! Gracias.
Bueno ... de acuerdo con este informe de error de php , 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.'';
}
?>
Te da una advertencia, pero aún así evitas la comparación.
Deberías estar haciendo ===
como sugirió @postfuturist.
La razón para usarlo es porque strcmp
devuelve <0 si str1 es menor que str2; > 0 si str1 es mayor que str2, y 0 si son iguales.
===
solo devuelve true
o false
, no te dice cuál es la cadena "mayor".
No use ==
en PHP. No hará lo que esperas. Incluso si está comparando cadenas con cadenas, PHP las convertirá implícitamente en flotantes y hará una comparación numérica si parecen numéricas.
Por ejemplo, ''1e3'' == ''1000''
devuelve verdadero. Deberías usar ===
lugar.
Nunca debes usar ==
para la comparación de cadenas. ===
está bien.
$something = 0;
echo (''password123'' == $something) ? ''true'' : ''false'';
Simplemente ejecuta el código anterior y verás por qué.
$something = 0;
echo (''password123'' === $something) ? ''true'' : ''false'';
Ahora, eso es un poco mejor.
PHP En lugar de usar orden alfabético, use el valor ASCII del personaje para hacer la comparación. Las letras minúsculas tienen un valor ASCII más alto que las mayúsculas. Es mejor usar el operador de identidad === para hacer este tipo de comparación. strcmp () es una función para realizar comparaciones de cadenas seguras binarias. Toma dos cadenas como argumentos y devuelve <0 si str1 es menor que str2; > 0 si str1 es mayor que str2, y 0 si son iguales. También hay una versión que no distingue entre mayúsculas y minúsculas llamada strcasecmp () que primero convierte las cadenas en minúsculas y luego las compara.
Puede usar strcmp()
si desea ordenar / comparar cadenas lexicographically . Si solo deseas verificar la igualdad, entonces ==
está bien.
Siempre recuerde, cuando compare cadenas, debe usar el operador ===
(comparación estricta) y no el operador ==
(comparación suelta).
También la función puede ayudar en la clasificación. Para ser más claros sobre la clasificación. strcmp () devuelve menos de 0 si string1 ordena antes de string2, mayor que 0 si string2 ordena antes de 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á mayor que cero, ya que aaao se está clasificando antes de aabo.
Usar ==
puede 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 true
, lo que podría no ser lo que su código esperará.
Sin embargo, se recomienda usar ===
, ya que la prueba muestra que es un poco más rápido que strcmp()
y su strcasecmp()
alternativo strcasecmp()
distingue strcasecmp()
.
Google googlea rápidamente esta comparación de velocidad: snipplr.com/view/758
strcmp () y "===" distinguen entre mayúsculas y minúsculas, pero "===" es mucho más rápido
Código de ejemplo: snipplr.com/view/758