Подтвердить что ты не робот

Слабая печать в PHP: зачем вообще использовать isset?

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

if ($tx) 

или

if (isset($tx))

зачем мне делать второй, когда сложнее писать?

4b9b3361

Ответ 1

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

"isset() вернет FALSE, если тестирует переменную, которая была установлена ​​в NULL" (php.net/isset).

Это означает, что в некоторых случаях, например, проверка параметров GET или POST, использование isset() достаточно, чтобы определить, установлена ​​ли переменная (потому что она будет либо строкой, либо не будет установлена). Однако в случаях, когда NULL является возможным значением для переменной, что довольно часто встречается при попадании в объекты и более сложные приложения, isset() оставляет вас высоко и сухо.

Например (протестировано с PHP 5.2.6 с Suhosin-Patch 0.9.6.2 (cli) (построено: 17.08.2008 09:05:31)):

<?php
$a = '';
$b = NULL;
var_dump(isset($a));
var_dump(isset($b));
var_dump(isset($c));

выходы:

bool(true)
bool(false)
bool(false)

Спасибо, PHP!

Ответ 2

if ($tx)

Этот код будет оценивать значение false для любого следующих условий:

unset($tx); // not set, will also produce E_WARNING
$tx = null;
$tx = 0;
$tx = '0';
$tx = false;
$tx = array();

Приведенный ниже код будет оцениваться только в false при следующих условиях:

if (isset($tx))

// False under following conditions:
unset($tx); // not set, no warning produced
$tx = null;

Для некоторых людей типизация очень важна. Однако PHP по дизайну очень гибкий с переменными типами. Вот почему были созданы Variable Handling Functions.

Ответ 3

isset() не имеет ничего общего с TYPE или VALUE - только с EXISTENCE.

if ($ condition)... будет оценивать значение VALUE OF VARIABLE как логическое значение.

if (isset ($ condition))... будет оценивать СУЩЕСТВУЮЩЕЕ ЗНАЧЕНИЕ как логическое.

isset() может быть ложным по двум причинам.

Во-первых, потому что переменная не установлена ​​и поэтому не имеет значения.

Во-вторых, поскольку переменная имеет значение NULL, что означает "неизвестное значение" и не может считаться установленным, поскольку оно включает "нет значения" и потому, что многие люди используют $v = null для обозначения того же, что и unset ($ v).

(Помните, что если вы специально хотите проверить значение null, используйте is_null().)

isset() обычно используется для проверки внешней переменной, которая может или не может существовать.

Например, если у вас есть страница с именем page.php, это имеет значение:

ini_set('display_errors', 1);
error_reporting(E_ALL);

if ( $_GET["val"] ) {
    // Do Something
} else {
    // Do Nothing
}

он будет работать нормально для любого из этих URL:

http://www.example.com/page.php?val=true // Something will be done.
http://www.example.com/page.php?val=monkey // Something will be done.

http://www.example.com/page.php?val=false  // Nothing will be done.
http://www.example.com/page.php?val=0// Nothing will be done.

Однако вы получите сообщение об ошибке для этого URL:

http://www.example.com/page.php

потому что в URL-адресе нет аргумента "val", поэтому в массиве $_GET нет индекса "val".

Правильный способ сделать это:

if ( isset($_GET["val"]) ) {
    if ( $_GET["val"] ) {
        // Do Something
    } else {
        // Do Nothing
    }
} else {
    // $_GET["value"] variable doesn't exist.  It is neither true, nor false, nor null (unknown value), but would cause an error if evaluated as boolean.
}

Хотя для этого есть ярлыки.

Вы можете проверить комбинацию существования и определенных булевых условий с пустым(),

if ( !empty($_GET["val"]) ) {
    // Do someting if the val is both set and not empty
    // See http://php.net/empty for details on what is considered empty
    // Note that null is considered empty.
}

или

if ( isset($_GET["val"]) and $_GET["val"] ) {
    // Do something if $_GET is set and evaluates to true.
    // See php.net logical operators page for precedence details,
    // but the second conditional will never be checked (and therefor
    // cause no error) if the isset returns false.
}

Ответ 4

Первый работает только в зависимости от того, как настроен ваш сервер. На многих производственных серверах он сломается.

Используйте isset() и веселитесь.

Или попробуйте свой код со следующим в начале источника PHP и посмотрите, как он сломается:

ini_set('display_errors', 1);
error_reporting(E_ALL);

Ответ 5

Проще говоря, сравнение не одно и то же. Первый будет переводить переменную в логическое, что приведет к сбою проверки на пустые массивы, нечисловые строки и другие проверки, в которых определенная переменная определенно задана. Вторая проверка (isset()) проверяет, существует ли вообще переменная.

Я бы никогда не выполнил первую проверку (boolean cast), не проверив также тип переменной.

Не говоря уже о том, что первая проверка вызовет E_NOTICE, и я всегда буду работать с максимальным уровнем сообщений об ошибках.

Ответ 6

Поскольку первый может также проверить true/false, который вы можете или не хотите.

Ответ 7

Потому что первый вызывает предупреждение, а также возвращает true, если $tx === false, что не совпадает с неопределенным

Ответ 8

Эти два совершенно разные, как указывал каждый отдельный ответ. Если вы не используете isset, многие вещи будут оценивать значение false, особенно массивы, значения false, числовые значения 0 (и другие) и т.д. Верно это.

Мне кажется странным, что все так быстро защищают правильное программирование на PHP. Если я хочу сделать правильное программирование, у меня есть множество статически типизированных, строго типизированных языков для этого. Мне кажется, что одно преимущество PHP заключается в том, что мне не нужно много думать о типах. Конечно, бывают случаи, когда

if ($tx)

оценивает значение false, когда оно действительно имеет значение, но если вы хотите проверить , если это объект транзакции или нет, он либо работает, либо нет. Оказывается, что с картой Doctrine этот код

if (isset($tx))

всегда оценивает значение true после захвата первого объекта запроса. Вместо этого я должен сказать

if ($tx instanceof PurchaseRecord)

Итак, я хочу сказать, что в PHP вы знаете, что тестируете! Например, если это параметр из запроса GET, он будет либо пустым, либо пустым, либо иметь значение. Вы должны справиться с этими тремя случаями. Или два случая, или любое количество случаев, которые у вас есть в вашем конкретном коде. Как только вы это сделаете, если он работает на вашем сервере разработки, и он работает на вашем рабочем сервере, возможно, вы можете сказать, что он работает и продолжает свою жизнь?

(В Java или С# он должен компилироваться, а затем запускаться без исключения исключений. Большинство исключений NullPointer в Java на самом деле бросаются без каких-либо проблем: API Java не может проверить все нули в коде, потому что это невозможно, а также потому что это не проблема.Если он компилируется и работает, когда он должен, вы знаете, что ваш код в порядке, а затем вы можете беспокоиться о том, чтобы выбрасывать более правильные Исключения.)

Если во всех точках вам нужно знать, какие базовые типы вашего кода в PHP, почему бы не использовать код с использованием типов в первую очередь? Или более того, почему бы не воспользоваться слабостью PHP и кодом с кодом, который выполняется.

Ответ 9

Также важно отметить, что строка в PHP может быть установлена, но пустой. Таким образом, isset вернет true, хотя в строке нет ничего, чтобы предотвратить это, я использую функцию, подобную этой, чтобы заменить isset:

<?php
    function exists($var) {
        if (isset($var) && $var != "") {
            return true;
        } else {
            return false;
        }
    }
?>