Странное PHP Сравнение и преобразование целых чисел - PullRequest
6 голосов
/ 13 февраля 2012

Я работал над кодом для разбора данных, когда натолкнулся на следующее.

$line = "100 something is amazingly cool";
$key = 100;

var_dump($line == $key);

Ну, большинство из нас ожидает, что дамп выдаст false, но, к моему удивлению, дамп был true!

Я понимаю, что в PHP есть преобразование типов, подобное этому:

$x = 5 + "10 is a cool number"; // as documented on PHP manual
var_dump($x); // int(15) as documented.

Но почему сравнение, подобное тому, как я упоминал в первом примере, преобразует мою строку в целое вместо преобразованияцелое число в строку.

Я понимаю, что вы можете сделать === строгое сравнение с моим примером, но я просто хочу знать:

  • Есть ли какая-либо часть документации PHP, упомянутая втакое поведение?
  • Может кто-нибудь дать объяснение, почему происходит в PHP?
  • Как программисты могут предотвратить такую ​​проблему?

Ответы [ 2 ]

4 голосов
/ 13 февраля 2012

Если я правильно вспомню, PHP «приведёт» две переменные к минимально возможному типу. Они называют это жонглированием типа.

попробуй: var_dump("something" == 0); например, это даст вам правду. , это укусило меня однажды.

Подробнее: http://php.net/manual/en/language.operators.comparison.php

1 голос
/ 15 февраля 2014

Я знаю, что на этот вопрос уже есть ответ и он принят, но я хотел добавить что-то, что может помочь другим, кто найдет это с помощью поиска.

У меня была такая же проблема, когда я сравнивал массив записей с ключами в массиве PHP, где в моем массиве записей было дополнительное строковое значение.

$_POST["bar"] = array("other");

$foo = array(array("name"=>"foobar"));

foreach($foo as $key=>$data){
    $foo[$key]["bar"]="0";
    foreach($_POST["bar"] as $bar){
        if($bar==$key){
            $foo[$key]["bar"]="1";
        }
    }
}

Исходя из этого, вы можете подумать, что в конце $foo[0]["bar"] будет равно "0", но происходит то, что когда $key = int 0 сравнивалось свободно с $bar = string "other", результатом было true, чтобы исправить это, я строго сравнивается, но затем необходимо преобразовать $key = int 0 в $key = string "0", когда массив POST был определен как array("other","0"); Сработало следующее:

$_POST["bar"] = array("other");

$foo = array(array("name"=>"foobar"));

foreach($foo as $key=>$data){
    $foo[$key]["bar"]="0";
    foreach($_POST["bar"] as $bar){
        if($bar==="$key"){
            $foo[$key]["bar"]="1";
        }
    }
}

Результатом было $foo[0]["bar"]="1", если "0" было в массиве POST-баров, и $foo[0]["bar"]="0", если "0" не было в массиве POST-баров.

Помните, что при сравнении переменных ваши переменные могут не сравниваться, как вы думаете, из-за свободной типизации переменных в PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...