Erro em Comparação PHP

O que ando aprendendo nesta caminhada sobre a Terra

Erro em Comparação PHP

Hoje, Eu estava escrevendo um script em PHP para ser usado na linha de comando, quando me deparei com um comportamento inesperado (pelo menos da minha parte).
O script deve receber três argumentos, o último de uma lista que contém um ou mais códigos numéricos.
Tentando validar este último argumento obtive um resultado diferente do esperado.
Veja o trecho de código que eu estava usando.:

// test.php
if (php_sapi_name() = = 'cli') {
    $di = isset($argv[1]) ? $argv[1] : Data('Y-m-d'); // Initial Date
    $df = isset($argv[2]) ? $argv[2] : Data('Y-m-d'); // Final Date
    $prods = isset($argv[3]) ? explodir(',', $argv[3]) : matriz(); // Lista de códigos

    ##### Validando
    // Initial Date
    if ($di != Data('Y-m-d', strtotime($di))) {
        Eco "\n";
        Eco "ERRO! DATA inicial inválida!\n";
        saída;
    }
    // Final Date
    if ($DF != Data('Y-m-d', strtotime($DF))) {
        Eco "\n";
        Eco "ERRO! Data FINAL inválida!\n";
        saída;    
    }

    // Codes
    if (contagem($Aguilhões) >; 0) {
        foreach ($agulhadas como $prod) {
            se ($prod != (int)$prod) {
                Eco "\n";
                Eco "ERRO! O código " . $prod . " é inválido!\n" ;
                saída;
            }
        }
    }
    Eco "FEITO!";
}

É interessante, quando eu executei

# php -f teste. php 2015-12-10 2015-12-11 33b

o resultado foi

# FEITO

e revertendo a condição

        se ($prod = = (int)$prod)

exibiu a mensagem esperada.
Tentei atribuir a uma variável independente e ainda continuou não funcionando.

            $verificar = (int) $prod;
            se ($prod != $check) {

Porquêêê??

A Comparação de Tipo

!==

Não pode ser usado aqui, uma vez que todos os argumentos serão strings. Quando eu pensei sobre isso eu cheguei na resposta.

Então eu fiz alguns testes de linha de comando e verificar o comportamento do PHP comparações na verdade.

Quando fazemos as coisas como:

$seqüência de caracteres = = $integer

PHP irá sempre fazer um CAST de String para o outro tipo antes da comparação, Então o código

$seqüência de caracteres = = (int) $string

sempre retornará true, desde $string será alterado para int em ambos os lados.

Para evitar este tipo de problema, é necessário ter a mesma em ambos os lados da comparação.

            $conf = (int) $prod;
            se ($prod != (string) $conf) {
            // OR
            if ($prod != (string)(int)$prod) {

Até mais.

 ;

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

Este site utiliza o Akismet para reduzir spam. Fica a saber como são processados os dados dos comentários.