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.