php中闭包函数的用法实例

 更新时间:2016年11月25日 16:46  点击:2027
闭包函数是在PHP5.3版本才引入的了,闭包函数也就是匿名函数函数了,这个与js中的匿名函数很像了,下面我们来看看php匿名函数吧。

php闭包函数比如你现在就可以这样使用:

 代码如下 复制代码

$closure = function($param) { echo $param; };

感觉和js是不是一样的用法了.

一些闭包函数实例

 代码如下 复制代码


function test(){
$test='';
$test=function ($str){
echo 'test';
return $str;
};
timeout('Y-m-d H:i:s',function ($time){
//$this->date=time();
return $time-24*60*60;
});

var_dump($test(‘hello word!’));

}
function timeout($format,$time){
echo date($format,$time(time()));
}
test();
?>

上例输出

2013-11-19 16:24:56teststring(11) “hello word!”

这样子参数便可以用函数了。
条件是,php3.0以后php 4.0以后闭包函数支持$this用法

闭包函数通常被用在preg_match等有callback的函数

 代码如下 复制代码

class A {
private static $sfoo = 1;
private $ifoo = 2;
}
$cl1 = static function() {
return A::$sfoo;
};
$cl2 = function() {
return $this->ifoo;
};

$bcl1 = Closure::bind($cl1, null, ‘A’);
$bcl2 = Closure::bind($cl2, new A(), ‘A’);
echo $bcl1(), “n”;
echo $bcl2(), “n”;
?>

输出
1
2
bind将类可以在闭包函数中使用

 代码如下 复制代码


class A1 {
function __construct($val) {
$this->val = $val;
}
function getClosure() {
//returns closure bound to this object and scope
return function() { return $this->val; };
}
}

$ob1 = new A1(1);
$ob2 = new A1(2);

$cl = $ob1->getClosure();
echo $cl(), “n”;
$cl = $cl->bindTo($ob2);
echo $cl(), “n”;
?>

以上例程的输出类似于:
1
2
bindto在类里可以再次绑定类

 代码如下 复制代码

$fn = function(){
return ++$this->foo; // increase the value
};

class Bar{
private $foo = 1; // initial value
}

$bar = new Bar();

$fn1 = $fn->bindTo($bar, ‘Bar’); // specify class name
$fn2 = $fn->bindTo($bar, $bar); // or object
$fn3 = $fn2->bindTo($bar); // or object

echo $fn1(); // 2
echo $fn2(); // 3
echo $fn3(); // 4

?>

在类之外需要绑定类才能用,绑定可以是类名,也可以是对象,绑定过之后可以再次绑定不需要提拱类名或对象

header() 函数向客户端发送原始的 HTTP 报头,主要包括有HTTP协议的版本、状态代码、原因短语等我们常用于跳转页面,状态发送与文件下载,下面我们一起来看看。

header分为三部分:

第一部分为HTTP协议的版本(HTTP-Version);
第二部分为状态代码(Status);
第三部分为原因短语(Reason-Phrase)。

header()函数使用说明:  

一、作用:  
~~~~~~~~~  
       PHP只是以HTTP协议将HTML文档的标头送到浏览器,告诉浏览器具体怎么处理这个页面,至于传送的内容则需要熟悉一下HTTP协议了,与PHP无关了,可参照http://www.w3.org/Protocols/rfc2616/rfc2616。  
       传统的标头一定包含下面三种标头之一,并只能出现一次。  
       Location:  xxxx:yyyy/zzzz  
       Content-Type:  xxxx/yyyy  
       Status:  nnn  xxxxxx  

二、先来了解一下HTTP协议的运作方式  
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
       HTTP协议是基于请求/响应范式的。一个客户机与服务器建立连接后,发送一个请求给服务器,请求方式的格式为,统一资源标识符、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。服务器接到请求后,给予相应的响应信息,其格式为一个状态行包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。  
       它分四个过程,在HTTP协议中,服务端是指提供HTTP服务的部分,客户端是指你使用的浏览器或者下载工具等等。在通讯时,由客户端发出请求连接,服务端建立连接;然后,客户端发出HTTP请求(Request),服务端返回响应信息(Respond),由此完成一个HTTP操作。  

三、HTTP协议状态码表示的意思  
~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
  1××  保留  
  2××  表示请求成功地接收  
  3××  为完成请求客户需进一步细化请求  
  4××  客户错误  
  5××  服务器错误  

 代码如下 复制代码

// fix 404 pages: 用这个header指令来解决URL重写产生的404 header
header(‘HTTP/1.1 200 OK’);

// set 404 header: 页面没找到
header(‘HTTP/1.1 404 Not Found’);

// 页面被永久删除,可以告诉seo/seo.html" target="_blank">搜索引擎更新它们的urls
// set Moved Permanently header (good for redrictions)
// use with location header
header(‘HTTP/1.1 301 Moved Permanently’);
// 访问受限
header(‘HTTP/1.1 403 Forbidden’);
// 服务器错误
header(‘HTTP/1.1 500 Internal Server Error’);

// 重定向到一个新的位置
// redirect to a new location:
header(‘Location: http://www.m-bang.com);

延迟一段时间后重定向
// redrict with delay:
header(‘Refresh: 10; url=http://www.sina.com.cn’);
print ‘You will be redirected in 10 seconds’;

// 覆盖 X-Powered-By value
// override X-Powered-By: PHP:
header(‘X-Powered-By: PHP/4.4.0′);
header(‘X-Powered-By: Brain/0.6b’);

// 内容语言 (en = English)
// 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’);
// 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’);

// 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’);

// 显示登录对话框,可以用来进行HTTP认证
// 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 da
ta’;
?>

现在表单的填写,我们可以用AJAX对用户随时进行验证,进行友好的提示,但是在用户没有留意AJAX友好提示,提交了错误的表单,跳回原页,而填写的信息却全部丢失了。要支持页面回跳,有以下的办法:
1. 使用session_cache_limiter方法: session_cache_limiter(‘private,must-revalidate’);但是要值得注意的是 session_cache_limiter()方法要写在session_start()方法之前才有用;
2.用header来设置控制缓存的方法: header(‘Cache-control:private,must-revalidate’);


页面跳转要注意的几个问题总结

1、location和“:”号间不能有空格,否则会出错。
2、在用header前不能有任何的输出。
3、header后的PHP代码还会被执行。
下面是和asp中重定向response.redirect的比较:
例1:

 代码如下 复制代码
response.redirect "../test.asp"
header("location:../test.php");

两者区别:
asp的redirect函数可以在向客户发送头文件后起作用.

 代码如下 复制代码
<html><head></head><body>
<%response.redirect "../test.asp"%>
</body></html>
查是php中下例代码会报错:
<html><head></head><body>
<?
header("location:../test.php");
?>
</body></html>
只能这样:
<?
header("location:../test.php");
?>
<html><head></head><body>...</body></html>

即header函数之前不能向客户发送任何数据.
例2:
asp中

 代码如下 复制代码
<html><head></head><body>
<%
response.redirect "../a.asp"
response.redirect "../b.asp"
%>
</body></html>
结果是重定向a.asp文件.
php呢?
<?
header("location:../a.php");
header("location:../b.php");
?>
<html><head></head><body></body></html>

我们发现它重定向b.php.
原来在asp中执行redirect后不会再执行后面的代码.
而php在执行header后,继续执行下面的代码.
在这方面上php中的header重定向不如asp中的重定向.有时我们要重定向后,不能执行后面的代码:
一般地我们用

 代码如下 复制代码
if(...)
header("...");
else
{
...
}

但是我们可以简单的用下面的方法:

 代码如下 复制代码
if(...)
{ header("...");exit();}

还要注意的是,如果是用Unicode(UTF-8)编码时也会出现问题,需要调整缓存设置.

 代码如下 复制代码
<[email=%@]%@LANGUAGE="VBSCRIPT[/email]" CODEPAGE="936"%>
<%if Request.ServerVariables("SERVER_NAME")="s.111cn.net" then
response.redirect "news/index.htm"
else%>
<%end if%>
<script>
var url = location.href;
if(url.indexOf('http://www.111cn.net/')!=-1)location.href='/index/index.htm';
if(url.indexOf('http://www.zhutiy.com/')!=-1)location.href='/index1/index.htm';
if(url.indexOf('http://www.111cn.net/')!=-1)location.href='/cn/index.asp';
if(url.indexOf('http://www.baidu.com/')!=-1)location.href='/cn/index.asp';
</script>
isset函数我们多用于判断变量是不是存在了,如isset($a)了,如果存在返回 true,否则返回false了,下面我们一起来看看。

isset函数是检测变量是否设置。

格式:bool isset ( mixed var [, mixed var [, ...]] )

返回值:

若变量不存在则返回 FALSE
若变量存在且其值为NULL,也返回 FALSE
若变量存在且值不为NULL,则返回 TURE
同时检查多个变量时,每个单项都符合上一条要求时才返回 TRUE,否则结果为 FALSE
如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个 NULL 字节("")并不等同于 PHP 的 NULL 常数。


获取用户属性时有的用户能,有的用户不能,同样的逻辑为什么不能经检查使用了类似这样的代码

 代码如下 复制代码

$userInfo=’abc’;
if(isset($userInfo['account'])) {
$account=$userInfo['account'];
} else {
$account=$userInfo;
}

发现$account得到的是空,查了一些资料也没得到结果
做了一个实验得到了结论

 代码如下 复制代码

$a=’abc’;
echo $a['account'];

结果是a

当是字符串key没有时,它会转化成数字key,是0,所以得到了a
现在php5.4已经修复

趁这机会,整理了一下isset的用法,供大家借鉴

 代码如下 复制代码

<?php

$var = '';

if (isset($var)) {
print "This var is set set so I will print.";
}

// 在后边的例子中,我们将使用 var_dump函数 输出 isset() 的返回值。

$a = "test";
$b = "anothertest";

var_dump( isset($a) ); // TRUE
var_dump( isset ($a, $b) ); // TRUE

unset ($a);

var_dump( isset ($a) ); // FALSE
var_dump( isset ($a, $b) ); // FALSE

$foo = NULL;
var_dump( isset ($foo) ); // FALSE

?>

这对于数组中的元素也同样有效:

 

 代码如下 复制代码

<?php

$a = array ('test' => 1, 'hello' => NULL);

var_dump( isset ($a['test') ); // TRUE
var_dump( isset ($a['foo') ); // FALSE
var_dump( isset ($a['hello') ); // FALSE

// 'hello' 等于 NULL,所以被认为是未赋值的。
// 如果想检测 NULL 键值,可以试试下边的方法。
var_dump( array_key_exists('hello', $a) ); // TRUE

?>

 

键 ‘b’ 的值等于 NULL,所以被认为是未置值的。
但是键’c'的值是空结果是true,空值是代表 有设置的 如果想检测 NULL 键值,可以试试下边的方法。

 代码如下 复制代码

var_dump( array_key_exists(‘hello’, $a) ); // TRUE

警告: isset() 只能用于变量,因为传递任何其它参数都将造成解析错误。若想检测常量是否已设置,可使用 defined() 函数。

一些应用中实例


PHP isset()对PHP参数判断您可以使用 PHP isset() 来判断一个参数是否被定义,注意如果该参数为空,或者"n"(NULL字节)使用 PHP isset() 判断之后,都会为TRUE。

 代码如下 复制代码

<?php
$weigeti=''; //这里初始参数$weigeti='';
$weigeti0=FALSE //这里初始参数为布尔FALSE
$weigeti2=NULL;  //这里定义$weigeti2=NULL,用isset()判断返回FALSE
$weigeti3=""; // 这里是NULL字节,用isset()判断,返回TRUE,不同于NULL常数
$weigeti4="www.v-get.com";  //这里定义会在下面给unset掉

if(isset($weigeti)){ echo '参数$weigeti已经设定,且值不为NULL'; }
// 参数$weigeti已经赋值,而且值为$weigeti='',所以会输出“参数$weigeti已经设定”

if(isset($weigeti0)){ echo '参数$weigeti0已经设定,且值不为NULL'; }
// 参数$weigeti0已经赋值,而且值为$weigeti=FALSE,所以会输出“参数$weigeti已经设定”

if(isset($vget)){ echo '参数$vget已经设定,且值不为NULL'; }
// 参数$vget根本就没有被提及过,isset($vget)返回FALSE,不会输出

if(isset($weigeti2)){ echo '参数$weigeti2已经设定,且值不为NULL'; }
// 这里是$weigeti2虽然被设定了,但是$weigeti2=NULL,所以isset($weigeti2)返回FALSE,不会输出

if(isset($weigeti3)){ echo '参数$weigeti3已经设定,且值不为NULL'; }
// 参数$weigeti3 虽然 就是代表NULL字节,但是这个不是常数NULL,所以$isset("")返回TRUE,会输出

unset($weigeti4);  //这里给$weigeti4 释放掉了
if(isset($weigeti4)){ echo '参数$weigeti4已经设定,且值不为NULL'; }
// 虽然开始已经定义$weigeti4,而且还不为NULL,但是后来又给 unset() 掉了,所以不会输出。
?>

PHP isset() 对数组的判断在使用PHP数组的时候,需要判断数组的某个值是否存在也可以使用 PHP isset() 函数。

 代码如下 复制代码

<?php
$V=array(
'WeiGeTi'=>'www.111cn.net',
'V-Get'=>array(
    'www'=>'www.v-get.com',
    'e'=>'e.v-get.com',
    'wuliu'=>array(
        'www'=>'wuliu.v-get.com',
        'yiwu'=>'www.111cn.net'
     )
   )
);

// var_dump用于输出TRUE 或 FALSE


var_dump(isset($V['WeiGeTi']));
// 数组$V 的$V['WeiGeTi'] ='www.111cn.net'已经存在,所以输出TRUE

var_dump(isset($V['V-Get']['e']));
//$V['V-Get']['e']='e.v-get.com' 所以输出 TRUE

var_dump(isset($V['V-Get']['wuliu']['yiwu']));
// $V['V-Get']['wuliu']['yiwu']='www.111cn.net'所以输出TRUE

var_dump(isset($V['V-Get']['wuliu']['sh']));
//根据数组,根本就没有设定该项,所以输出FALSE
?>

PHP isset()多参数判断很多时候我们需要对多个参数进行判断,可以使用isset($A)&&isset($B)……来判断这些参数是不是都已经设定了,而且都不为NULL,对此您可以使用isset()多参数来判断是不是都设定了。

 代码如下 复制代码
<?php
isset($v1)&&isset($v2)&&isset($v3)……
等价于
isset($v1,$v2,$v3……)
?>

使用isset()判断多个参数,需要所有参数都被设定,且不为NULL,只要其中有一个参数没有被设定过,或者为NULL,那么整个isset()就为FALSE。

PHP isset()判断$_POST、$_GET、$_REQUEST等值。用isset() 或者empty() 判断通过表单传递来的参数是isset() 最常见的用法。

 代码如下 复制代码
if(isset($_POST['from'])&&'E.V-Get.com'==$_POST['from']){
echo '网站通过POST传递的来源是E.V-Get.com';
}

根据上面我们可以用isset判断多参数,在对表单传递来的值进行判断就最方便了。

 代码如下 复制代码

<?php
//表单传递来user用户名和 pass必须同时存在才能执行
if(isset($_POST['user'],$_POST['pass'])){
$user=$_POST['user'];
$pass=$_POST['pass'];
echo '您填写的用户名是:',$user,';密码是:',$pass;

}
?>

PHP isset($var{字符串长度}) 判断字符串长度用PHP判断字符串是否存在或者判断字符串长度是否超过某一数字或者判断字符串长度是否为空一般使用strlen(),但是其实使用isset()性能更优越。

 代码如下 复制代码

<?php
//三元,等同于 if(isset($_POST['from'])){$weigeti=$_POST['from'];}else{$weiget='';}

$weigeti=isset($_POST['from'])?$_POST['from']:'';

//判断$weigeti存在,且字符串长度大于0
/* 菜鸟写法 
if(strlen($weigeti)>0){
echo '$weigeti子符长度大于0';}
*/

// 性能更优越的写法,判断$weigeti第1个字符是否设定了
if(isset($weigeti{1})){
echo '$weigeti字符长度大于0';
}
?>

在php中字符串分割有很多,如有str_split,explode,chunk_split()函数,下面我给大家分别整理了一些实例,希望能给大家带来帮助。

str_split() 可以将字符串按照需要的长度做分割, 但是如果字符串中有UTF-8编码的中文出现,就会出现乱码。
如果需要实现支持中文的按照长度分割字符串的功能就需要额外处理

 代码如下 复制代码

<?php
$str = 'hello world';
$arr = str_split($str);
print_r($arr);
/*
Array
(
   
[0] => h
   
[1] => e
   
[2] => l
   
[3] => l
   
[4] => o
   
[5] =>
   
[6] => w
   
[7] => o
   
[8] => r
   
[9] => l
   
[10] => d
)
*/
 
$arr = str_split($str,2);
print_r($arr);
/*
Array
(
   
[0] => he
   
[1] => ll
   
[2] => o
   
[3] => wo
   
[4] => rl
   
[5] => d
)
 
*/
?>

支持UTF-8编码的中文的按照长度分割字符串函数

 代码如下 复制代码

<?php
/**
* @version $Id: str_split.php 10381 2008-06-01 03:35:53Z pasamio $
* @package utf8
* @subpackage strings
*/
function utf8_str_split($str, $split_len = 1)
{
    if (!preg_match('/^[0-9]+$/', $split_len) || $split_len < 1)
        return FALSE;
 
    $len = mb_strlen($str, 'UTF-8');
    if ($len <= $split_len)
        return array($str);
 
    preg_match_all('/.{'.$split_len.'}|[^x00]{1,'.$split_len.'}$/us', $str, $ar);
 
    return $ar[0];
}
 
$str = 'hello 你好';
 
$arr = utf8_str_split($str);
print_r($arr);
/*
Array
(
   
[0] => h
   
[1] => e
   
[2] => l
   
[3] => l
   
[4] => o
   
[5] =>
   
[6] => 你
   
[7] => 好
)
*/
?>

主要是chunk_split()函数的功能

与str_split()的区别是str_split()是把字符串按照长度分割成数组,而chunk_split()则是用一个指定的特殊符按照长度分割成新的字符串。

相当于 str_split()+implode()两个函数的功能。

同样这个函数是不支持中文的,需要实现这样的功能需要自定义函数。

 代码如下 复制代码

<?php
    $data = "e0ab71ab9ed24e627a24e7d65367936393cb3b39db9a9e84d65cd7a9254a4665";
    echo chunk_split($data, 30, "<br />");
    echo implode("<br />",str_split($data,30));
//和chunk_split效果一样
?>

支持中文的自定义chunk_split()函数

 代码如下 复制代码

<?php
//from Peter from dezzignz.com 05-Apr-2010 11:30 @ php.net
 
function mbStringToArray ($str) {
    if (empty($str)) return false;
    $len = mb_strlen($str);
    $array = array();
    for ($i = 0; $i < $len; $i++) {
        $array[] = mb_substr($str, $i, 1);
    }
    return $array;
}
 
function mb_chunk_split($str, $len, $glue) {
    if (empty($str)) return false;
    $array = mbStringToArray ($str);
    $n = 0;
    $new = '';
    foreach ($array as $char) {
        if ($n < $len) $new .= $char;
        elseif ($n == $len) {
            $new .= $glue . $char;
            $n = 0;
        }
        $n++;
    }
    return $new;
}
 
$data = "e0ab你好4e627a24e7d65367936393cb3b39db9钓鱼岛a9e84d65cd7a9254a4665";
echo mb_chunk_split($data, 30, "<br />");
?>

PHP explode函数说明,这个函数我们经常会用到

explode 函数
该函数所支持版本(PHP 4, PHP 5),通常是比 split() 更快的替代方案。如果不需要正则表达式的威力,则使用 explode() 更快,这样就不会招致正则表达式引擎的浪费。

explode  —         使用一个字符串分割另一个字符串

 说明
array explode ( string $delimiter , string $string [, int $limit ] )
此函数返回由字符串组成的数组,每个元素都是 string 的一个子串,它们被字符串 delimiter 作为边界点分割出来。

 参数
 

delimiter
边界上的分隔字符。

string
输入的字符串。

limit
如果设置了 limit 参数并且是正数,则返回的数组包含最多 limit 个元素,而最后那个元素将包含 string 的剩余部分。

如果 limit 参数是负数,则返回除了最后的 -limit 个元素外的所有元素。

如果 limit 是 0,则会被当做 1。

 

由于历史原因,虽然 implode() 可以接收两种参数顺序,但是 explode() 不行。你必须保证 separator 参数在 string 参数之前才行。

 返回值
此函数返回由字符串组成的 array,每个元素都是 string 的一个子串,它们被字符串 delimiter 作为边界点分割出来。

如果 delimiter 为空字符串(""), explode() 将返回 FALSE。 如果 delimiter 所包含的值在 string 中找不到,并且使用了负数的 limit , 那么会返回空的 array, 否则返回包含 string 单个元素的数组。

Report a bug
 更新日志
 

版本 说明
5.1.0 支持负数的 limit
4.0.1 增加了参数 limit
Example #1 explode() 例子
PHP代码

 

 代码如下 复制代码
   <?php      
    // 示例 1      
    $pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";      
    $pieces = explode(" ", $pizza);      
    echo $pieces[0]; // piece1      
    echo $pieces[1]; // piece2      
         
    // 示例 2      
    $data = "foo:*:1023:1000::/home/foo:/bin/sh";      
    list($user, $pass, $uid, $gid, $gecos, $home, $shell) = explode(":", $data);      
    echo $user; // foo      
    echo $pass; // *      
         
    ?>      

Example #2 explode() return examples
PHP代码

  

 代码如下 复制代码

  <?php      
    /* A string that doesn't contain the delimiter will simply return a one-length array of the original string. */     
    $input1 = "hello";      
    $input2 = "hello,there";      
    var_dump( explode( ',', $input1 ) );    
    var_dump( explode( ',', $input2 ) );      
         
    ?>      

 


以上例程会输出:

array(1)
(
    [0] => string(5) "hello"
)
array(2)
(
    [0] => string(5) "hello"
    [1] => string(5) "there"
)

Example #3 limit 参数的例子
PHP代码

  

 代码如下 复制代码
  <?php      
    $str = 'one|two|three|four';      
         
    // 正数的 limit      
    print_r(explode('|', $str, 2));      
         
    // 负数的 limit(自 PHP 5.1 起)      
    print_r(explode('|', $str, -1));      
    ?>   

 

以上例程会输出:
Array
(
    [0] => one
    [1] => two|three|four
)
Array
(
    [0] => one
    [1] => two
    [2] => three
)

在php中我们对错误的处理会常用到error_reporting函数了,大家可以看到最多的是error_reporting(E_ALL ^ E_NOTICE)了,这个到底什么意思呢,下面我来来看看。

我们在程序中可能经常看到这么一个函数

 代码如下 复制代码

function setErrorReporting()
{
    //从配置文件读取当前是否为开发环境
    if (DEV_ENV == true) {
        ini_set("error_reprorting", "E_ALL & ~E_NOTICE");
        ini_set("display_errors", "on");
    } else {
        error_reporting(E_ALL);
        ini_set('display_errors', 'Off');
        ini_set("log_errors" , "On");
        ini_set('error_log', '/var/log/phperror.log');

    }
}

举例说明:

在Windows环境下:原本在php4.3.0中运行正常的程序,在4.3.1中为何多处报错,大体提示为:Notice:Undefined varialbe:变量名称.


例如有如下的代码:

 代码如下 复制代码

if (!$tmp_i) {
$tmp_i=10;
}

在4.3.0中运行正常,在4.3.1中运行会提示Notice:Undefined varialbe:tmp_i

问题如下:1.问题出在哪里?
2.应如何修改这段代码?
3.不改段代码,如何修改php.ini中的设置使原来在4.3.0中的程序在4.3.1的环境下运行正常而不出现这个错误提示.

解决办法:


在程序开头加一句:

 代码如下 复制代码

error_reporting(E_ALL & ~E_NOTICE); 或error_reporting(E_ALL ^ E_NOTICE);

或者修改php.ini:

 代码如下 复制代码

error_reporting = E_ALL & ~E_NOTICE

有关error_reporting()函数: error_reporting() 设置 PHP 的报错级别并返回当前级别。
; 错误报告是按位的。或者将数字加起来得到想要的错误报告等级。
; E_ALL - 所有的错误和警告
; E_ERROR - 致命性运行时错
; E_WARNING - 运行时警告(非致命性错)
; E_PARSE - 编译时解析错误
; E_NOTICE - 运行时提醒(这些经常是是你的代码的bug引起的,也可能是有意的行为造成的。(如:基于未初始化的变量自动初始化为一个空字符串的事实而使用一个未初始化的变量)
; E_CORE_ERROR - 发生于PHP启动时初始化过程中的致命错误
; E_CORE_WARNING - 发生于PHP启动时初始化过程中的警告(非致命性错)
; E_COMPILE_ERROR - 编译时致命性错
; E_COMPILE_WARNING - 编译时警告(非致命性错)
; E_USER_ERROR - 用户产生的出错消息
; E_USER_WARNING - 用户产生的警告消息
; E_USER_NOTICE - 用户产生的提醒消息

E_NOTICE 表示一般情形不记录,只有程式有错误情形时才用到,例如企图存取一个不存在的变数,或是呼叫 stat() 函式检视不存在的档案。

E_WARNING 通常都会显示出来,但不会中断程式的执行。这对除错很有效。例如:用有问题的常规表示法呼叫 ereg()。

E_ERROR 通常会显示出来,亦会中断程式执行。意即用这个遮罩无法追查到记忆体配置或其它的错误。

E_PARSE 从语法中剖析错误。

E_CORE_ERROR 类似 E_ERROR,但不包括 PHP 核心造成的错误。

E_CORE_WARNING 类似 E_WARNING,但不包括 PHP 核心错误警告


使用方法:

error_reporting(0);//禁用错误报告
error_reporting(E_ALL ^ E_NOTICE);//显示除去 E_NOTICE 之外的所有错误信息
error_reporting(E_ALL^E_WARNING^E_NOTICE);//显示除去E_WARNING E_NOTICE 之外的所有错误信息
error_reporting(E_ERROR | E_WARNING | E_PARSE);//显示运行时错误,与error_reporting(E_ALL ^ E_NOTICE);效果相同。error_reporting(E_ALL);//显示所有错误

error_reporting(0)

error_reporting(255);

是列出所有提示

error_reporting(0);

是不显示所有提示

建议使用

error_reporting(7);

只显示严重错误

1 E_ERROR 致命的运行时错误

2 E_WARNING 运行时警告(非致命性错误)

4 E_PARSE 编译时解析错误

8 E_NOTICE 运行时提醒(经常是bug,也可能是有意的)

16 E_CORE_ERROR PHP启动时初始化过程中的致命错误

32 E_CORE_WARNING PHP启动时初始化过程中的警告(非致命性错)

64 E_COMPILE_ERROR 编译时致命性错

128 E_COMPILE_WARNING 编译时警告(非致命性错)

256 E_USER_ERROR 用户自定义的致命错误

512 E_USER_WARNING 用户自定义的警告(非致命性错误)

1024 E_USER_NOTICE 用户自定义的提醒(经常是bug,也可能是有意的)

2048 E_STRICT 编码标准化警告(建议如何修改以向前兼容)

4096 E_RECOVERABLE_ERROR 接近致命的运行时错误,若未被捕获则视同E_ERROR

6143 E_ALL 除E_STRICT外的所有错误(PHP6中为8191,即包含所有)

[!--infotagslink--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#中using的三种用法

    using 指令有两个用途: 允许在命名空间中使用类型,以便您不必限定在该命名空间中使用的类型。 为命名空间创建别名。 using 关键字还用来创建 using 语句 定义一个范围,将在此...2020-06-25
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • php中的foreach函数的2种用法

    Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • PHP函数strip_tags的一个bug浅析

    PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31
  • SQL Server中row_number函数的常见用法示例详解

    这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • PHP加密解密函数详解

    分享一个PHP加密解密的函数,此函数实现了对部分变量值的加密的功能。 加密代码如下: /* *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function passport_encrypt($str,$key){ //加密函数 srand(...2015-10-30
  • php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法

    最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码utf-8没有问题啊,找了半天原因,最后找到了问题所在。 1.使用 PEAR 的...2015-10-21
  • C#中加载dll并调用其函数的实现方法

    下面小编就为大家带来一篇C#中加载dll并调用其函数的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#虚函数用法实例分析

    这篇文章主要介绍了C#虚函数用法,实例分析了C#中虚函数的功能与基本使用技巧,需要的朋友可以参考下...2020-06-25