首页 > 编程技术 > php

再谈php中empty与isset区别详解

发布时间:2016-11-25 16:47

empty与isset在php中一个是为空,另一个判断是是否为一个存在的变量了,下面小编来给各位同学介绍php中empty与isset区别,欢迎各位同学进入参考。

empty是判断变量值是非空或非零的值。对应空定义包括:“”(空字符串)、0、“0”、NULL、FALSE、array()和$var(只声明但未赋值)。也就是说当变量值为上述这些,empty返回TRUE,其他的都返回FALSE。

isset是检测变量是否设置,并且不是 NULL。变量设置可以从几个方面来说。1:最简单的就是变量是否先声明和赋值;2:array中是否存在对应的index或key;3:object中是否存在对应的属性。

从上面的两个function定义可以看到,在某些情况下,两者可以公用,但其区别还是很大的。另外它们都只能检测变量,检测任何非变量的东西都将导致解析错误。例如直接检查另一个function的返回值(empty(otherFunction())),你将看到“Fatal error: Can’t use function return value in write context in”这样的错误。

另外isset可以一次检查多个变量,例如:isset($var1, $var2, $var3),当这三个值分别的isset都为TRUE结果为TRUE,否则结果为FALSE。

测试代码:

 代码如下 复制代码

$sep = "<br />";

echo 'test undeclared var empty : ';
var_dump(empty($var)); // TRUE
echo $sep . 'test undeclared var isset : ';
var_dump(isset($var)); // FALSE

$var;
echo $sep . 'test declared var but no set value empty : ';
var_dump(empty($var)); // TRUE
echo $sep . 'test declared var but no set value isset : ';
var_dump(isset($var)); // FALSE, 变量申明未赋值,默认值为NULL

$var = NULL;
echo $sep . 'test declared var and set value NULL empty : ';
var_dump(empty($var)); // TRUE
echo $sep . 'test declared var and set value NULL isset : ';
var_dump(isset($var)); // FALSE, 变量申明赋值为NULL

$var1 = ''; $var2 = '0'; $var3 = 0; $var4 = FALSE; $var5 = array();

echo $sep . 'test '' empty : ';
var_dump(empty($var1)); // TRUE
echo $sep . 'test '0' empty : ';
var_dump(empty($var2)); // TRUE
echo $sep . 'test 0 empty : ';
var_dump(empty($var3)); // TRUE
echo $sep . 'test FALSE empty : ';
var_dump(empty($var4)); // TRUE
echo $sep . 'test array() empty : ';
var_dump(empty($var5)); // TRUE
echo $sep . 'test '', '0', 0, FALSE, array() isset : ';
var_dump(isset($var1, $var2, $var3, $var4, $var5)); // TRUE,  变量申明并赋值为空字符串

输出的结果为:

 代码如下 复制代码

test undeclared var empty : bool(true)
test undeclared var isset : bool(false)
test declared var but no set value empty : bool(true)
test declared var but no set value isset : bool(false)
test declared var and set value NULL empty : bool(true)
test declared var and set value NULL isset : bool(false)
test '' empty : bool(true)
test '0' empty : bool(true)
test 0 empty : bool(true)
test FALSE empty : bool(true)
test array() empty : bool(true)
test '', '0', 0, FALSE, array() isset : bool(true)

比如检测 $id 变量,当 $id=0 时,用empty() 和 isset() 来检测变量 $id 是否已经配置,两都将返回不同的值—— empty() 认为没有配置,isset() 能够取得 $id 的值:

 代码如下 复制代码

 $id=0;
    empty($id)?print "It's empty .":print "It's $id .";
      //结果:It's empty .
    print "<br>";
    !isset($id)?print "It's empty .":print "It's $id .";
      //结果:It's 0 .

   这意味着,我们在使用变量处理函数时,当该变量可能出现0的值,使用 empty() 要小心,这个时候用 isset 取代它更明智一些。

当一个php页面的 URL 尾部参数出现 id=0 时(比如:test.php?id=0),试比较:

 代码如下 复制代码

if(empty($id)) $id=1; - 若 id=0 ,id 也会为1
if(!isset($id)) $id=1; - 若 id=0 ,id 不会为1

可分开运行以下代码检测上述推断:

 代码如下 复制代码

 if(empty($id)) $id=1;
    print $id; // 得到 1

    if(!isset($id)) $id=1;
    print $id; //得到 0

Ctype函数是Php的Ctype扩展函数提供了一组函数用于校验字符串中的字符是否是正确的格式,这篇文章我们主要介绍一下这些字符串验证函数的语法、有什么特殊的函数,如何去验证

Ctype函数是PHP内置的字符串体测函数。主要有以下几种

ctype_alnum -- Check for alphanumeric character(s)
检测是否是只包含[A-Za-z0-9]

ctype_alpha -- Check for alphabetic character(s)
检测是否是只包含[A-Za-z]


ctype_cntrl -- Check for control character(s)
检查是否是只包含类是“nrt”之类的字 符控制字符


ctype_digit -- Check for numeric character(s)
检查时候是只包含数字字符的字符串(0-9)


ctype_graph -- Check for any printable character(s) except space
检查是否是只包含有可以打印出来的字符(除了空格)的字符串


ctype_lower -- Check for lowercase character(s)
检查是否所有的字符都是英文字母,并且都是小写的


ctype_print -- Check for printable character(s)
检查是否是只包含有可以打印出来的字符的字符串


ctype_punct -- Check for any printable character which is not whitespace or an alphanumeric character
检查是否是只包含非数字/字符/空格的可打印出来的字符


ctype_space -- Check for whitespace character(s)
检查是否是只包含类是“ ”之类的字符和空格


ctype_upper -- Check for uppercase character(s)
检查是否所有的字符都是英文字母,并且都是大写的


ctype_xdigit -- Check for character(s) representing a hexadecimal digit
检查是否是16进制的字符串,只能包括 “0123456789abcdef”

如果使用他们

废话不多说直接上代码:

 代码如下 复制代码

<?php
$str1 = 'Azxc1234';//true
$str2 = '123#Axy';//false
if (ctype_alnum($string)) {
    echo "This string totally works";
}
else {
    echo "And this one not so much";
}

注意:如果传第一个空字符串,在php5.1之后是返回 false,但是早期的版本是返回true.

只要确保传递给函数的参数是一个字符串就不会有问题。

 代码如下 复制代码

<?php
$integer = 42;
ctype_digit($integer);         // false
ctype_digit((string)$integer); // true

结论

在使用PHP的过程中,同样的操作可能有不同的方法,选择一个合适的方法显然很重要。在PHP里判断字符串类型的函数有两类,ctype_*和 is_* 他们在实际的应用中 is_*这一系列的函数用的更多一些。当然除了这些办法我们还可以选择使用正则表达式来做判断,而且更强大,但是使用PHP内置的函数可以更好地减少出错率。

php 中遍历一个array时可以使用for或foreach,foreach的语法为:foreach ($arr as $k => $v)。遍历数组,把index赋给$k,数组的值赋给$v,那么此处的赋值是传值还是传引用呢。

php中foreach()的用法

foreach()有两种用法:

1:

 代码如下 复制代码
foreach(array_name as $value)
   {
      statement;
   }

这里的array_name是你要遍历的数组名,每次循环中,array_name数组的当前元素的值被赋给$value,并且数组内部的下标向下移一步,也就是下次循环回得到下一个元素。
 
2:

 代码如下 复制代码
foreach(array_name as $key => $value)
   {
       statement;
    }

这里跟第一种方法的区别就是多了个$key,也就是除了把当前元素的值赋给$value外,当前元素的键值也会在每次循环中被赋给变量$key。键值可以是下标值,也可以是字符串。比如book[0]=1中的“0”,book[id]="001"中的“id”.

看下面的例子:

 代码如下 复制代码

$arr = array(
    array('id' => 1, 'name' => 'name1'),
    array('id' => 2, 'name' => 'name2'),
);

foreach ($arr as $obj) {
    $obj['id'] = $obj['id'];
    $obj['name'] = $obj['name'] . '-modify';
}

print_r($arr); //输出的结果
Array(
    [0] => Array (
        [id] => 1
        [name] => name1
    )
    [1] => Array(
        [id] => 2
        [name] => name2
    )
)

观察可以发现在foreach循环中对$arr操作并没有影响到$arr的元素,所以这里的赋值是传值而不是传引用。那如果需要修改$arr中元素的值该怎么办呢?可以在变量前面加一个”&”符号,例如:

 代码如下 复制代码

foreach ($arr as &$obj) {
    $obj['id'] = $obj['id'];
    $obj['name'] = $obj['name'] . '-modify';
}

再看另外一个例子,array里面存放的是object,

 代码如下 复制代码

$arr = array(
    (object)(array('id' => 1, 'name' => 'name1')),
    (object)(array('id' => 2, 'name' => 'name2')),
);

foreach ($arr as $obj) {
    $obj->name = $obj->name  . '-modify';
}

print_r($arr); //输出的结果

Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [name] => name1-modify
        )

    [1] => stdClass Object
        (
            [id] => 2
            [name] => name2-modify
        )

)

此时可以看到原始数组中的object对象已经修改了,所以这里的赋值又是传引用而不是传值

综合上述,得出的结论:如果数组里面存放的是普通类型的元素就是采用传值的方式,存放对象类型元素采用的方式为传地址。

在php中header函数是一个很常用的函数了,它可以跳转也可以发送各种状态代码,如404,301或者页面编码,下面我来总结一下header函数常用方法。
 代码如下 复制代码


<?php
// fix 404 pages:
header('HTTP/1.1 200 OK');

// set 404 header:
header('HTTP/1.1 404 Not Found');

// set Moved Permanently header ('good for redrictions')
// use with location header
header('HTTP/1.1 301 Moved Permanently');

// redirect to a new location:
header('Location: http://www.111cn.net/');

// redrict with delay:
header('Refresh: 10; url=http://www.111cn.net/');
//print You will be redirected in 10 seconds;

// you could also use the HTML syntax:// <meta http-equiv="refresh" content="10;http://www.111cn.net/ />

// override X-Powered-By: PHP:
header('X-Powered-By: PHP/4.4.0');
header('X-Powered-By: Brain/0.6b');

// content language ('en = English')
header('Content-language: en');

// last modified ('good for caching')
$time = time('') – 60; // or filemtime('$fn'), etc
header('Last-Modified: .gmdate("D, d M Y H:i:s, ' . $time . '"). GMT');

// header for telling the browser that the content
// did not get changed
header('HTTP/1.1 304 Not Modified');

// set content length ('good for caching'):
header('Content-Length: 1234');

// Headers for an download:
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="example.zip"');
header('Content-Transfer-Encoding: binary');

// load the file to send:readfile('example.zip');
// Disable caching of the current document:
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
// Date in the pastheader('Pragma: no-cache');

 

// plain text file
header('Content-Type: image/jpeg');

// JPG picture
header('Content-Type: application/zip');

// ZIP file
header('Content-Type: application/pdf');

// PDF file
header('Content-Type: audio/mpeg');

// Audio MPEG ('MP3,…') file
header('Content-Type: application/x-shockwave-flash');

// Flash animation// show sign in box
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Top Secret"');
//print Text that will be displayed if the user hits cancel or ;
//print enters wrong login data;

 

// set content type:
header('Content-Type: text/html; charset=iso-8859-1');
header('Content-Type: text/html; charset=utf-8');
header('Content-Type: text/plain');

php页面为utf编码
header("Content-type: text/html; charset=utf-8");

php页面为gbk编码
header("Content-type: text/html; charset=gb2312");

php页面为big5编码
header("Content-type: text/html; charset=big5");

 

Header( "HTTP/1.1 301 Moved Permanently" ) ;
Header( "Location: www.111cn.net" );

下面我们以.txt文件为实例来介绍php读取本地文件的函数,读取文件我们可以利用fopen或file_get_contents来读取,file_get_contents更简单而fopen需要fread配合才可以显示读出的内容。

1.首先来介绍一下fopen()函数
下面我们给出了一个直接打开本地文件的代码demo,必要的地方我们都已经加上了注释:

 代码如下 复制代码

    //直接打开一个本地文件的实例代码  
    <?php  
    //假若我们本地的文件是一个名为xmlas.txt的文本  
    $filedemo = "xmlas.txt";  
    $fpdemo = fopen($filedemo,"r");  
    if ($fpdemo){  
     while(!feof($fpdemo)){  
      //1000读取的字符数  
      $datademo = fread($fpdemo, 1000);  
     }  
     fclose($fpdemo);  
    }  
    echo $datademo;  
    ?> 

2.使用file_get_contents() 函数将整个文件在一个字符串中输出:
假若我们的xmlas.txt文本文件中有这样一句话:现在的电影越来越没激情,想要全部高潮请看日本爱情

动作片!
那么我们file_get_contents() 函数的实例代码便如下:

 代码如下 复制代码

    <?php  
    echo file_get_contents("xmlas.txt");  
    //此时输出的内容便为xmlas.txt中的内容:  
    //现在的电影越来越没激情,想要全部高潮请看日本爱情动作片!  
    ?> 

3.如何读取本地的一个文件夹而不是一个单独文件:
请看下面的实例代码,在实例中我们将读取一个名为xmlas的文件夹:

 代码如下 复制代码
    <?php  
    $dirdemo = opendir('/xmlas');  
    while(($filedemo = readdir($dirdemo))!=false){  
      if ($filedemo!="." && $filedemo!="..") {   
        $nsdemo = explode('.', $filedemo);  
        echo $nsdemo[0];  
      }   
    }  
    closedir($dirdemo);  
    ?> 

4.我们还可以利用fopen来写文件

 代码如下 复制代码

/**
 *用fopen写入文件
 *@param string $filename
 *@param string $contents
 *@return boolean
 */
 
 function wirte($filename,&$contents)
 {
  $fp=fopen($filename,"wb");
  if($fp)
  {
   flock($fp,LOCK_EX);//同一时间锁定文件,只能一个人操作
   fwrite($fp,$contents);
   flock($fp,LOCK_UN);//保存数据握进行解锁文件并保存
   fclose($fp);
   return true;
  }else
  {
   return false;
  }
 }

这样我只要利用fopen配合fwrite就可以实现文件读写了。

注意:l打开文件

在打开文件文件之前,我们需要知道这个文件的路径,以及此文件是否存在。

用$_SERVER[“DOCUMENT_ROOT”]内置全局变量,来获得站点的相对路径。如下:

 代码如下 复制代码
$root = $_SERVER[“DOCUMENT_ROOT”];

 
在用函数file_exists()来检测文件是否存在。如下:

 代码如下 复制代码

If(!file_exists("$root/order.txt")){echo ‘文件不存在’;}

这样可能更合理更实用哦。

标签:[!--infotagslink--]

您可能感兴趣的文章: