Intereting Posts
Как вставлять твиттер-твиты .. Как поймать изображения с URL-адресов твитов и отображать фактические изображения? PHP OOP печатает переменную, которая имеет значение внутри функции, но вызов извне для печати add_action в wordpress с помощью OOP? Исключение исключений из Guzzle Заявление о выборе CodeIgniter с предложением Where Подтверждение ввода пользователя, на стороне клиента или на стороне сервера? PDOException SQLSTATE Неизвестная база данных «forge» не удалась Что такое почтовый токен в сгенерированном коде Postman? Вопросы по загрузке файлов PHP Можно ли присвоить значение переменной по умолчанию для выбора формы в Laravel Оберните все теги изображений в строке со ссылками XAMPP – кеш сеанса не настроен Как я могу использовать класс APP CakePHP для загрузки XML-файлов из URL-адреса? Как вызвать скрипт Python из PHP? Получение списка videoId в массиве с помощью api v3 playlistItems YouTube и создание другого видео-запроса для получения статистики viewCount

В PHP значение 0 (int, ноль) равно «первым» или «последнему» (строки)?

Я смущен тем, с чем я столкнулся в сценарии, над которым я работал. У меня было следующее:

function getPart($part) { $array = array('a', 'b', 'c'); if ($part == 'first') $part = 0; if ($part == 'last') $part = count($array) - 1; if (isset($array[$part])) return $array[$part]; return false; } $position = 0; echo getPart($position); 

Итак, если бы я попробовал строку «первым», я должен был получить «а» в качестве вывода. С строкой «last» я должен получить «c» и так далее. Когда я запускаю скрипт выше, с PHP 5.3, я получаю «c» …

Смущенный, я провел быстрый тест …

 var_dump(0 == 'first'); var_dump(0 == 'last'); 

Оба возвращают TRUEПОЧЕМУ ??? Я так смущен этим поведением!

Если вы попытаетесь сравнить строку с числом, PHP попытается преобразовать строку в число. В этом случае он не может этого сделать, поскольку PHP не может преобразовать «первый» или «последний» в число, поэтому он просто преобразует его в ноль. Это делает проверку 0 == 0 , что, конечно, верно. Используйте оператор идентификации === , если вы хотите, чтобы PHP не пытался конвертировать что-либо (так что два операнда должны иметь одно и то же значение и быть одного типа).

Проверьте (int) 'first' . Это, по сути, то, что делает PHP в правой части операнда.

PHP будет использовать типы операндов, если не использует строгий оператор сравнения равенства ( === ) между двумя операндами разных типов.

PHP слабо типизирован. То, что происходит, это попытка конвертировать "first" в число. Он терпит неудачу и возвращает ноль. Теперь он имеет два числа: ноль и ноль. Чтобы не пытаться преобразовать типы, используйте === а не == .

PHP немного странен в том, что он обрабатывает строку в числовом сравнении как 0. Вы можете принудительно провести сравнение строк, указав переменные:

 function getPart($part) { $array = array('a', 'b', 'c'); if ("$part" == 'first') $part = 0; if ("$part" == 'last') $part = count($array) - 1; if (isset($array[$part])) return $array[$part]; return false; }