PHP中的弱类型:为什么要使用isset?
似乎我的代码可以检查空值,如果我这样做
if ($tx)
或
if (isset($tx))
为什么我会在更难写的时候做第二个?
似乎我的代码可以检查空值,如果我这样做
if ($tx)
或
if (isset($tx))
为什么我会在更难写的时候做第二个?
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在设计上对变量类型非常灵活。这就是创建变量处理函数的原因。
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.
}