当前位置:  开发笔记 > 编程语言 > 正文

PHP中的弱键入:为什么要使用isset?

如何解决《PHP中的弱键入:为什么要使用isset?》经验,为你挑选了3个好方法。

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

if ($tx) 

要么

if (isset($tx))

为什么我会写第二个更难写?



1> matpie..:
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> Eli..:

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
}

它适用于任何这些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.
}



3> chazomaticus..:

我想指出,我在这里读到的每个人的反应应该有一个警告:

"如果测试已设置为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)):



输出:

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

谢谢,PHP!

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有