Error de comparación PHP
Hoy, Estaba escribiendo un script en PHP para ser utilizado en la línea de comandos cuando me topé con un comportamiento inesperado (por lo menos de mi parte).
El script debe recibir tres argumentos, la última de ellas una lista que contiene uno o más códigos numéricos.
Tratando de validar este último argumento fue conseguir un resultado diferente lo imaginado.
Ver el fragmento de código que estaba usando:
// test.php si (php_sapi_name() == 'cli') {
$di = isset($argv[1]) ? $argv[1] : fecha('Y-m-d'); // Fecha inicial $df = isset($argv[2]) ? $argv[2] : fecha('Y-m-d'); // Fecha final $prods = isset($argv[3]) ? explotar(',', $argv[3]) : arreglo de discos(); // Lista de códigos
##### Validación de
// Fecha inicial si ($di != fecha('Y-m-d', strtotime($di))) {
Eco "\n";
Eco "ERROR! FECHA de inicio no válido!\n";
salida;
}
// Fecha final si ($DF != fecha('Y-m-d', strtotime($DF))) {
Eco "\n";
Eco "ERRO! FECHA FINAL no válido!\n";
salida;
}
// Los códigos si (Conde($puntas de prueba) > 0) {
foreach ($sondas como $prod) {
If ($Prod != (int)$Prod) {
Eco "\n";
Eco "ERROR! El código de " . $Prod . " no es válido!\n" ;
salida;
}
}
}
Eco "HECHO!";
}
Es interesante que, Cuando corrieron
# php -f test.php 2015-12-10 2015-12-11 33b
el resultado fue
# HECHO
y revertir la condición de
If ($Prod == (int)$Prod)
muestran el mensaje esperado.
He intentado asignar a una variable independiente y continuaba no funciona.
$comprobar = (int) $Prod; If ($Prod != $check) {
Whyyy??
La comparación de tipo
!==
no se puede utilizar aquí, ya que todos los argumentos serán cadenas. Cuando yo aunque acerca de esto recibí la respuesta.
Así que hice algunas pruebas de línea de comandos y comprobar el comportamiento realmente de comparaciones PHP.
Cuando hacemos las cosas como:
$cadena == $integer
PHP haremos siempre un molde de cadena para el otro tipo antes de comparación, así que el código
$cadena == (int) $cadena
siempre devolverá true, desde $cadena se cambiará a int en ambos lados.
Para evitar este tipo de problemas, es necesario tener el mismo tipo en ambos lados de la comparación.
$conf = (int) $Prod; If ($Prod != (cadena) $conf) { // O si ($Prod != (cadena)(int)$Prod) {
Nos vemos.