PHP中有很多函数功能类似,却有着细微的差别...is_null, empty, isset, unset 我们先来看看这4个函数的描述。isset 判断变量是否已存在(配置) 
unset 把变量删除(释放)掉 
empty 判断变量是否为空 
is_null 判断变量是否为NULL
ok,已经开始搞人了。那么开始,这4个函数中除了unset,其他3个都是判断函数,unset首先出局,因为他不会搞错,其次是is_null,我们可以把它看成是!isset,是isset的一个逆操作,下面一张表可以很清楚的说明他们之间的关系: 变量           empty          is_null          isset
 $a=””          true            false           true
 $a=null        true            true            false
 var $a         true            true            false
 $a=array() true false true
 $a=false true false true
 $a=15 false false true
 $a=1 false false true
 $a=0 true false true
 $a=”0” true false true
 $a=”true” false false true
 $a=”false” false false true从中我们可以发现只要变量是否为" "或者0,或者是false和null,只要是这些值empty都会返回true,而isset是判断变量是否存在,只要你这个变量不是null或未赋值,返回结果都是true,而is_null正好是isset的反结果。当然如果只是想做如下工作:
echo !isset($_GET['a']);  //如果得不到变量a的值
echo empty($_GET['a']);  //如果变量a的值是空那么结果都是一样的,都可以用。

解决方案 »

  1.   

    示例代码:<table border="0" >
      <tr><td>变量</td><td>empty()</td><td>is_null()</td><td>isset()</td></tr>
     <?php 
     $a="";
     ?>
     <tr><td>$a="";</td><td><?php echo empty($a)?"true":"false";?></td><td><?php echo is_null($a)?"true":"false";;?></td><td><?php echo isset($a)?"true":"false";;?></td></tr>
     <?php 
     $a=null;
     ?>
     <tr><td>$a=null;</td><td><?php echo empty($a)?"true":"false";?></td><td><?php echo is_null($a)?"true":"false";;?></td><td><?php echo isset($a)?"true":"false";;?></td></tr>
     <?php 
     $a;
     ?>
     <tr><td>$a;</td><td><?php echo empty($a)?"true":"false";?></td><td><?php echo is_null($a)?"true":"false";;?></td><td><?php echo isset($a)?"true":"false";;?></td></tr>
     <?php 
     $a=array();
     ?>
     <tr><td>$a=array();</td><td><?php echo empty($a)?"true":"false";?></td><td><?php echo is_null($a)?"true":"false";;?></td><td><?php echo isset($a)?"true":"false";;?></td></tr>
     <?php 
     $a=false;
     ?>
     <tr><td>$a=false;</td><td><?php echo empty($a)?"true":"false";?></td><td><?php echo is_null($a)?"true":"false";;?></td><td><?php echo isset($a)?"true":"false";;?></td></tr>
     <?php 
     $a=15;
     ?>
     <tr><td>$a=15;</td><td><?php echo empty($a)?"true":"false";?></td><td><?php echo is_null($a)?"true":"false";;?></td><td><?php echo isset($a)?"true":"false";;?></td></tr>
     <?php 
     $a=1;
     ?>
     <tr><td>$a=1;</td><td><?php echo empty($a)?"true":"false";?></td><td><?php echo is_null($a)?"true":"false";;?></td><td><?php echo isset($a)?"true":"false";;?></td></tr>
     <?php 
     $a=0;
     ?>
     <tr><td>$a=0;</td><td><?php echo empty($a)?"true":"false";?></td><td><?php echo is_null($a)?"true":"false";;?></td><td><?php echo isset($a)?"true":"false";;?></td></tr>
     <?php 
     $a="0";
     ?>
     <tr><td>$a="0";</td><td><?php echo empty($a)?"true":"false";?></td><td><?php echo is_null($a)?"true":"false";;?></td><td><?php echo isset($a)?"true":"false";;?></td></tr>
     <?php 
     $a="true";
     ?>
     <tr><td>$a="true";</td><td><?php echo empty($a)?"true":"false";?></td><td><?php echo is_null($a)?"true":"false";;?></td><td><?php echo isset($a)?"true":"false";;?></td></tr>
     <?php 
     $a="false";
     ?>
     <tr><td>$a="false";</td><td><?php echo empty($a)?"true":"false";?></td><td><?php echo is_null($a)?"true":"false";;?></td><td><?php echo isset($a)?"true":"false";;?></td></tr>
     </table>
      

  2.   

    函数 htmlspecialchars() 和 htmlentities() 的解释都是:
    把一些预定义的字符转换为 HTML 实体。预定义的字符是:& (和号) " (双引号) ' (单引号) < (小于) > (大于) 语法:
    htmlspecialchars ( string, quotestyle, character-set )
    htmlentities( string, quotestyle, character-set )string 必需。规定要转换的字符串。 
    quotestyle 可选。规定如何编码单引号和双引号。 
    character-set 可选。字符串值,规定要使用的字符集。那么两者差别是:
    如果字符串中有中文,htmlentities 会将中文转换成乱码,需要设置 character-set 为 GB2312 才行!而 htmlspecialchars 无需设置,直接转换。所以还是建议使用 htmlspecialchars ,把 htmlentities 遗忘吧。
      

  3.   

    顶!!!!不知道当初为什么要加进来这么多函数,而且PHP中还有很多可以集成到一起的函数却分开,
    这是为什么呢!
      

  4.   

    自 PHP 4.1.0 起,取得外部变量的首选方法是用下面提及的超全局变量。在此之前,人们要么依赖 register_globals,要么就是长长的预定义 PHP 数组($HTTP_*_VARS)。自 PHP 5.0.0 起,长格式的 PHP 预定义变量可以通过设置 register_long_arrays 来屏蔽。(摘自php手册页) $GLOBALS 由所有已定义全局变量组成的数组。变量名就是该数组的索引。 这是一个“superglobal”,或者可以描述为自动全局变量。这只不过意味这它在所有的脚本中都有效。在函数或方法中不需要使用 global $GLOBALS; 来访问它。$GLOBALS 在 PHP 3.0.0 及以后版本中适用。  
    $_SESSION 包含当前脚本中 session 变量的数组。这是一个“superglobal”,或者可以描述为自动全局变量。这只不过意味这它在所有的脚本中都有效。在函数或方法中不需要使用 global $_SESSION; 来访问它,就如同使用 $HTTP_SESSION_VARS 一样。 $HTTP_SESSION_VARS 包含着同样的信息,但是不是一个自动全局变量(请注意 PHP 是把 $HTTP_SESSION_VARS 和 $_SESSION 这两个变量当作不同的变量来处理的)。如果设置了 register_globals 指令,这些变量也在所有脚本中可用;也就是,分离了 $_SESSION 和 $HTTP_SESSION_VARS 数组。  
    $_REQUEST 此关联数组包含 $_GET,$_POST 和 $_COOKIE 中的全部内容。 这是一个“superglobal”,或者可以描述为自动全局变量。这只不过意味着它在所有的脚本中都有效。在函数或方法中不需要使用 global $_REQUEST; 来访问它。如果设置了 register_globals 指令,这些变量也在所有脚本中可用;也就是,分离了 $_REQUEST 数组。PHP 4.1.0 及以后版本使用。之前的版本,没有等价的数组。 在 PHP 4.3.0 之前,$_FILES 也被包括在 $_REQUEST 数组中。  
    $_FILES 通过 HTTP POST 方法传递的已上传文件项目组成的数组。是自动全局变量。这是一个“superglobal”,或者可以描述为自动全局变量。这只不过意味这它在所有的脚本中都有效。在函数或方法中不需要使用 global $_FILES; 来访问它,就如同使用 $HTTP_POST_FILES 一样。$HTTP_POST_FILES 包含着同样的信息,但是不是一个自动全局变量(请注意 PHP 是把 $HTTP_POST_FILES 和 $_FILES 这两个变量当作不同的变量来处理的)。如果设置了 register_globals 指令,这些变量也在所有脚本中可用;也就是,分离了 $_FILES 和 $HTTP_POST_FILES 数组。在 PHP 4.1.0 及以后版本使用。之前的版本,使用 $HTTP_POST_FILES。  
    $_POST 通过 HTTP POST 方法传递的变量组成的数组。是自动全局变量。这是一个“superglobal”,或者可以描述为自动全局变量。这只不过意味这它在所有的脚本中都有效。在函数或方法中不需要使用 global $_POST; 来访问它,就如同使用 $HTTP_POST_VARS 一样。$HTTP_POST_VARS 包含着同样的信息,但是不是一个自动全局变量(注意:$HTTP_POST_VARS 和 $_POST 是不同的变量,PHP 处理它们的方式不同)。如果设置了 register_globals 指令,这些变量也在所有脚本中可用;也就是,分离了 $_POST 和 $HTTP_POST_VARS 数组。在 PHP 4.1.0 及以后版本使用。之前的版本,使用 $HTTP_POST_VARS。  
    $_GET 通过 HTTP GET 方法传递的变量组成的数组。是自动全局变量。这是一个“superglobal”,或者可以描述为自动全局变量。这只不过意味这它在所有的脚本中都有效。在函数或方法中不需要使用 global $_GET; 来访问它,就如同使用 $HTTP_GET_VARS 一样。$HTTP_GET_VARS 包含着同样的信息,但是不是一个自动全局变量(注意:$HTTP_GET_VARS 和 $_GET 是不同的变量,PHP 处理它们的方式不同)。如果设置了 register_globals 指令,这些变量也在所有脚本中可用;也就是,分离了 $_GET 和 $HTTP_GET_VARS 数组。在 PHP 4.1.0 及以后版本使用。之前的版本,使用 $HTTP_GET_VARS。  
    $_COOKIE 通过 HTTP cookies 传递的变量组成的数组。是自动全局变量。这是一个“superglobal”,或者可以描述为自动全局变量。这只不过意味这它在所有的脚本中都有效。在函数或方法中不需要使用 global $_COOKIE; 来访问它,就如同使用 $HTTP_COOKIE_VARS 一样。$HTTP_COOKIE_VARS 包含着同样的信息,但是不是一个自动全局变量(注意:$HTTP_COOKIE_VARS 和 $_COOKIE 是不同的变量,PHP 处理它们的方式不同)。如果设置了 register_globals 指令,这些变量也在所有脚本中可用;也就是,分离了 $_COOKIE 和 $HTTP_COOKIE_VARS 数组。在 PHP 4.1.0 及以后版本使用。之前的版本,使用 $HTTP_COOKIE_VARS。  
    $_ENV 在解析器运行时,这些变量从环境变量转变为 PHP 全局变量名称空间(namespace)。它们中的许多都是由 PHP 所运行的系统决定。完整的列表是不可能的。请查看系统的文档以确定其特定的环境变量。其它环境变量(包括 CGI 变量),无论 PHP 是以服务器模块或是以 CGI 处理方式运行,都在这里列出了。 这是一个“superglobal”,或者可以描述为自动全局变量。这只不过意味这它在所有的脚本中都有效。在函数或方法中不需要使用 global $_ENV; 来访问它,就如同使用 $HTTP_ENV_VARS 一样。$HTTP_ENV_VARS 包含着同样的信息,但是不是一个自动全局变量(注意:$HTTP_ENV_VARS 和 $_ENV 是不同的变量,PHP 处理它们的方式不同)。如果设置了 register_globals 指令,这些变量也在所有脚本中可用;也就是,分离了 $_ENV 和 $HTTP_ENV_VARS 数组。在 PHP 4.1.0 及以后版本使用。之前的版本,使用 $HTTP_ENV_VARS。  
    $php_errormsg $php_errormsg 是包含 PHP 产生的上一错误消息内容的变量。该变量在发生错误并且 track_errors 选项打开(默认为关闭)后才有效。 
    $_SERVER (在 PHP 4.1.0 及以后版本使用。之前的版本,使用 $HTTP_SERVER_VARS。) $_SERVER 是一个包含诸如头信息(header)、路径(path)和脚本位置(script locations)的数组。数组的实体由 web 服务器创建。不能保证所有的服务器都能产生所有的信息;服务器可能忽略了一些信息,或者产生了一些未在下面列出的新的信息。这意味着,大量的这些变量在CGI 1.1 规范中说明,所以应该仔细研究一下。这是一个“superglobal”,或者可以描述为自动全局变量。这只不过意味这它在所有的脚本中都有效。在函数或方法中不需要使用 global $_SERVER; 访问它,就如同使用 $HTTP_SERVER_VARS 一样。$HTTP_SERVER_VARS 包含着同样的信息,但是不是一个自动全局变量(注意:$HTTP_SERVER_VARS 和 $_SERVER 是不同的变量,PHP 处理它们的方式不同)。 如果设置了 register_globals 指令,这些变量也在所有脚本中可用;也就是,分离了 $_SERVER 和 $HTTP_SERVER_VARS 数组。这些单独的全局变量不是自动全局变量。或许会发现下面列出的某些 $_SERVER 元素并不可用。注意,如果以命令行方式运行 PHP,下面列出的元素几乎没有有效的(或是没有任何实际意义的)。 
    “PHP_SELF” :当前正在执行脚本的文件名,与 document root 相关。举例来说,在 URL 地址为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将会得到 /test.php/foo.bar 这个结果。__FILE__ 常量包含当前(例如包含)文件的绝对路径和文件名。 如果 PHP 以命令行方式运行,该变量在 PHP 4.3.0 之前无效。 
    “argv” :传递给该脚本的参数。当脚本运行在命令行方式时,argv 变量传递给程序 C 语言样式的命令行参数。当调用 GET 方法时,该变量包含请求的数据。 
    “argc” :包含传递给程序的命令行参数的个数(如果运行在命令行模式)。 
    “GATEWAY_INTERFACE” :服务器使用的 CGI 规范的版本。例如,“CGI/1.1”。 
    “SERVER_ADDR” :当前运行脚本所在的服务器的 IP 地址。 
    “SERVER_NAME” :当前运行脚本所在服务器主机的名称。如果该脚本运行在一个虚拟主机上,该名称是由那个虚拟主机所设置的值决定。 
    “SERVER_SOFTWARE” :服务器标识的字串,在响应请求时的头信息中给出。 
    “SERVER_PROTOCOL” :请求页面时通信协议的名称和版本。例如,“HTTP/1.0”。 
    “REQUEST_METHOD” :访问页面时的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT”。 (如果请求的方式是 HEAD,PHP 脚本将在送出头信息后中止(这意味着在产生任何输出后,不再有输出缓冲)。) 
    “REQUEST_TIME” :请求开始时的时间戳。从 PHP 5.1.0 起有效。 
    “QUERY_STRING” :查询(query)的字符串(URL 中第一个问号 ? 之后的内容)。 
    “DOCUMENT_ROOT” :当前运行脚本所在的文档根目录。在服务器配置文件中定义。 
    “HTTP_ACCEPT” :当前请求的 Accept: 头信息的内容。 
    “HTTP_ACCEPT_CHARSET” :当前请求的 Accept-Charset: 头信息的内容。例如:“iso-8859-1,*,utf-8”。 
    “HTTP_ACCEPT_ENCODING” :当前请求的 Accept-Encoding: 头信息的内容。例如:“gzip”。 
    “HTTP_ACCEPT_LANGUAGE” :当前请求的 Accept-Language: 头信息的内容。例如:“en”。 
    “HTTP_CONNECTION” :当前请求的 Connection: 头信息的内容。例如:“Keep-Alive”。 
    “HTTP_HOST” :当前请求的 Host: 头信息的内容。 
    “HTTP_REFERER” :链接到当前页面的前一页面的 URL 地址。不是所有的用户代理(浏览器)都会设置这个变量,而且有的还可以手工修改 HTTP_REFERER。因此,这个变量不总是真实正确的。 
    “HTTP_USER_AGENT” :当前请求的 User-Agent: 头信息的内容。该字符串表明了访问该页面的用户代理的信息。一个典型的例子是:Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)。也可以使用 get_browser() 得到此信息。 
    “HTTPS” :如果脚本是通过 HTTPS 协议被访问,则被设为一个非空的值。 
    “REMOTE_ADDR” :正在浏览当前页面用户的 IP 地址。 
    “REMOTE_HOST” :正在浏览当前页面用户的主机名。反向域名解析基于该用户的 REMOTE_ADDR。(必须配置 Web 服务器来建立此变量。例如 Apache 需要在 httpd.conf 中有 HostnameLookups On。参见 gethostbyaddr()。 ) 
    “REMOTE_PORT” :用户连接到服务器时所使用的端口。 
    “SCRIPT_FILENAME” :当前执行脚本的绝对路径名。(如果脚本在 CLI 中被执行,作为相对路径,例如 file.php 或 ../file.php,$_SERVER['SCRIPT_FILENAME'] 将包含用户指定的相对路径。) 
    “SERVER_ADMIN” :该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。 
    “SERVER_PORT” :服务器所使用的端口。默认为“80”。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。 
    “SERVER_SIGNATURE” :包含服务器版本和虚拟主机名的字符串。 
    “PATH_TRANSLATED” :当前脚本所在文件系统(不是文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。 (PHP 4.3.2 之后,PATH_TRANSLATED 在 Apache 2 SAPI 模式下不再和 Apache 1 一样隐含赋值,而是若 Apache 不生成此值,PHP 便自己生成并将其值放入 SCRIPT_FILENAME 服务器常量中。这个修改遵守了 CGI 规范,PATH_TRANSLATED 仅在 PATH_INFO 被定义的条件下才存在。 Apache 2 用户可以使用 httpd.conf 中的 AcceptPathInfo On 来定义 PATH_INFO。 ) 
    “SCRIPT_NAME” :包含当前脚本的路径。这在页面需要指向自己时非常有用。__FILE__ 包含当前文件的绝对路径和文件名(例如包含文件)。 
    “REQUEST_URI” :访问此页面所需的 URI。例如,“/index.html”。 
    “PHP_AUTH_DIGEST” :当作为 Apache 模块运行时,进行 HTTP Digest 认证的过程中,此变量被设置成客户端发送的“Authorization”HTTP 头内容(以便作进一步的认证操作)。 
    “PHP_AUTH_USER” :当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。 
    “PHP_AUTH_PW” :当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。 
    “AUTH_TYPE” :当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型。 
     
      

  5.   

    "0"==0, 
    ""==0, 
    "0" != ""A==B, B==C, A!=Cphp的==不具备传递性, 这点也很让人疯狂,应该用===的时候用了==,调试起来很郁闷
      

  6.   

    接分…
    顺便提一下
    这篇文章有很多误解的地方 (PHP手册都有说明)
      

  7.   

    列出的四个中(is_null, empty, isset, unset)
    只有is_null是函数, 其他都是语言结构!isset 不同于 is_null
    支援的传入参数都不同, 而且一个是语言结构, 一个是普通函数isset 跟 empty 用途不同, 以下用途不正确
    echo !isset($_GET['a']);
    echo empty($_GET['a']); // 不正确的检测, 这个会报错的详情请看英文版手册
      

  8.   


    htmlspecialchars , htmlentities 
    中文手册可能翻译成一样, 但是不同的
      

  9.   

    $A = "This ";
    $GLOBALS['B']="is ";
    Function Sum(){
        Echo $GLOBALS['A'],$GLOBALS['B'],'<br>';
    $GLOBALS['C']=$GLOBALS['A'].$GLOBALS['B']."C!";
    }Sum();
    Echo $C;