似乎我的代码可以检查null,如果我这样做
if ($tx)
Run Code Online (Sandbox Code Playgroud)
要么
if (isset($tx))
Run Code Online (Sandbox Code Playgroud)
为什么我会写第二个更难写?
mat*_*pie 20
if ($tx)
Run Code Online (Sandbox Code Playgroud)
对于以下任何条件,此代码将评估为false :
unset($tx); // not set, will also produce E_WARNING
$tx = null;
$tx = 0;
$tx = '0';
$tx = false;
$tx = array();
Run Code Online (Sandbox Code Playgroud)
以下代码仅在以下条件下评估为false:
if (isset($tx))
// False under following conditions:
unset($tx); // not set, no warning produced
$tx = null;
Run Code Online (Sandbox Code Playgroud)
对于某些人来说,打字非常重要.但是,PHP的设计非常灵活,可变类型.这就是创建变量处理函数的原因.
isset()与TYPE或VALUE无关 - 仅与EXISTENCE有关.
if($ condition)...将VALIA OF VARIABLE评估为布尔值.
if(isset($ condition))...将可变值的存在性评估为布尔值.
由于两个原因,isset()可能是false.
首先,因为没有设置变量,所以没有值.
其次,因为变量是NULL,这意味着"未知值"并且不能被认为是因为它包含"无值"并且因为很多人使用$ v = null来表示与未设置($ v)相同的事物.
(请记住,如果您特别想要检查null,请使用is_null().)
isset()通常用于检查可能存在或不存在的外部变量.
例如,如果您有一个名为page.php的页面,则具有以下内容:
ini_set('display_errors', 1);
error_reporting(E_ALL);
if ( $_GET["val"] ) {
// Do Something
} else {
// Do Nothing
}
Run Code Online (Sandbox Code Playgroud)
它适用于任何这些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.
Run Code Online (Sandbox Code Playgroud)
但是,您将收到此URL的错误:
http://www.example.com/page.php
Run Code Online (Sandbox Code Playgroud)
因为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.
}
Run Code Online (Sandbox Code Playgroud)
虽然有这方面的捷径.
您可以使用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.
}
Run Code Online (Sandbox Code Playgroud)
要么
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.
}
Run Code Online (Sandbox Code Playgroud)
我想指出,我在这里读到的每个人的反应应该有一个警告:
"如果测试已设置为NULL的变量"(php.net/isset),"isset()将返回FALSE".
这意味着在某些情况下,比如检查GET或POST参数,使用isset()就足以判断变量是否已设置(因为它将是一个字符串,或者它不会被设置).但是,如果NULL是变量的可能值,这在进入对象和更复杂的应用程序时相当常见,则isset()会让您高度干燥.
例如(使用带有Suhosin-Patch 0.9.6.2(cli)的PHP 5.2.6测试(内置:2008年8月17日09:05:31)):
<?php
$a = '';
$b = NULL;
var_dump(isset($a));
var_dump(isset($b));
var_dump(isset($c));
Run Code Online (Sandbox Code Playgroud)
输出:
bool(true)
bool(false)
bool(false)
Run Code Online (Sandbox Code Playgroud)
谢谢,PHP!