Error de comparación PHP

O ando aprendendo nesta caminhada sobre una Terra

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
if (php_sapi_name() == 'cli') {
    $di = isset($argv[1]) ? $argv[1] : fecha('Y-m-d'); // Initial Date
    $df = isset($argv[2]) ? $argv[2] : fecha('Y-m-d'); // Final Date
    $prods = isset($argv[3]) ? explotar(',', $argv[3]) : arreglo de discos(); // Lista de códigos

    ##### Validación de
    // Initial Date
    if ($di != fecha('Y-m-d', strtotime($di))) {
        Eco "\n";
        Eco "ERROR! FECHA de inicio no válido!\n";
        salida;
    }
    // Final Date
    if ($DF != fecha('Y-m-d', strtotime($DF))) {
        Eco "\n";
        Eco "ERRO! FECHA FINAL no válido!\n";
        salida;    
    }

    // Codes
    if (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) {
            // OR
            if ($Prod != (cadena)(int)$Prod) {

Nos vemos.

 ;

Contesta

Su dirección de correo electrónico no se publicará. Los campos obligatorios están marcados *

Este sitio utiliza Akismet para reducir el spam. Aprender cómo se procesaron los datos de comentario.