Работал ли isset по-другому в старых версиях
-
03-07-2019 - |
Вопрос
У меня есть какой-то устаревший код, в котором есть это:
<?PHP
if(isset($_GET['pagina'])=="homepage") {
?>
HtmlCode1
<?php
} else {
?>
HtmlCode2
<?php
}
?>
Я не знаю точно, почему, но, похоже, это работает.htmlcode1 загружается, когда у меня есть?pagina=домашняя страница, а htmlcode2 загружается, когда pagina var не существует или является чем-то другим (на самом деле не видел с чем-то другим, просто его там нет).Веб-сайт использует php4 (точную версию не знаю).Но на самом деле, как это может сработать?Я просмотрел руководство, и там сказано, что isset возвращает bool..
Кто-нибудь?
Решение
Проблема в том, что "==" не является зависимым от типа сравнением.Любая (непустая) строка "равна" логическому значению true, но не идентичный к нему (для этого вам нужно использовать оператор "===").
Краткий пример, почему вы видите такое поведение:
http://codepad.org/aNh1ahu8
И для получения более подробной информации об этом из документации см.:
http://php.net/manual/en/language.operators.comparison.php
http://ca3.php.net/manual/en/types.comparisons.php (в частности, таблица "Свободные сравнения с ==")
Другие советы
isset()
возвращает значение true или false.В логическом сравнении, "homepage"
оценил бы, чтобы true
.Итак, по сути, вы попали сюда:
if ( isset($_GET['pagina']) == true )
Если pagina равна чему-либо, вы увидите HtmlCode1.Если он не установлен, вы увидите HtmlCode2.
Я просто попробовал, чтобы подтвердить это, и собираюсь ?pagina=somethingelse
делает нет показать HtmlCode2.
Я подозреваю, что это ошибка, поскольку на самом деле не имеет смысла сравнивать true / false с "домашней страницей".Я бы ожидал, что код на самом деле должен быть:
if (isset($_GET['pagina']) && ($_GET['pagina'] == "homepage")) {
}
Некоторые идеи, как это могло бы работать (помимо ранее упомянутой "домашней страницы" ==true):
- Isset был где-то переопределен?
- Это самоизменяющаяся версия PHP?