PHP中的弱类型:为什么要使用isset?

2022-08-30 22:51:11

似乎我的代码可以检查空值,如果我这样做

if ($tx) 

if (isset($tx))

为什么我会在更难写的时候做第二个?


答案 1
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在设计上对变量类型非常灵活。这就是创建变量处理函数的原因。


答案 2

isset() 与 TYPE 或 VALUE 无关 - 仅与存在有关。

如果 ($condition)...将变量的值作为布尔值计算。

如果 ( isset($condition) )...将变量值的存在性作为布尔值进行评估。

isset() 可能为 false,原因有两个。

首先,因为变量未设置,因此没有值。

其次,因为变量是NULL,这意味着“未知值”,不能被认为是set,因为它包含“no value”,并且因为很多人使用$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.
}

虽然有捷径可走。

您可以使用 empty() 检查存在性和某些布尔条件的组合,

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.
}

推荐