1. 高级调试函数 debug_zval_dump
与var_dump的区别, 它新增了一个值refcount,即记录变量被引用的次数.
在手册上有这样一行代码"debug_zval_dump(&$var)" 注意到,在高版本php中是不能使用&的。如果需要引用,要在定义函数的时候加上&符号,而不是在调用的时候如此使用,否则,在5版本会报Fetal Error ,在7版本会报 parse Error。手册更新比较慢,大家注意一下。
$var1 = 'Hello World';
debug_zval_dump($var1);
这段代码在php5 和7测试下,结果都一致
$var1 = 'Hello World';
$var2 = '';
$var2 =& $var1;
debug_zval_dump($var1);
这段代码,在php5和7下的测试结果是不一致的。到笔者写这篇文章为止,手册上仍然是关于5的返回值说明:“Why refcount(1)? Because a copy of $var1 is being made, when the function is called.”但实际的输出,是refcount(2) .
2.高级调试函数 debug_backtrace
它可以回溯跟踪函数的调用信息,可以说是一个调试利器。
function one()
{
echo "a";
two();
}
function two()
{
echo "b";
three();
}
function three()
{
echo "c";
echo "<pre>";
var_dump(debug_backtrace());
}
one();
/*
abc
array(3) {
[0]=>
array(4) {
["file"]=>
string(28) "C:\works\wamp\www\test\t.php"
["line"]=>
int(604)
["function"]=>
string(5) "three"
["args"]=>
array(0) {
}
}
[1]=>
array(4) {
["file"]=>
string(28) "C:\works\wamp\www\test\t.php"
["line"]=>
int(599)
["function"]=>
string(3) "two"
["args"]=>
array(0) {
}
}
[2]=>
array(4) {
["file"]=>
string(28) "C:\works\wamp\www\test\t.php"
["line"]=>
int(613)
["function"]=>
string(3) "one"
["args"]=>
array(0) {
}
}
}
*/
3.函数 reset() current() end() next() prev() each()
函数 | 说明 |
---|---|
reset() | 函数将内部指针指向数组的第一个元素并输出 |
current() | 返回数组中当前元素的值 |
next() | 将内部指针指向数组的下一个元素并输出 |
prev() | 将内部指针指向数组的上一个元素并输出 |
end() | 将内部指针指向数组的最后一个元素并输出 |
each() | 返回当前元素的键名和键值,并将内部指针向前移动 |
$people = array("Bill", "Steve", "Mark", "David");
echo current($people) . "<br>"; // 当前元素是 Bill
echo next($people) . "<br>"; // Bill 的下一个元素是 Steve
echo current($people) . "<br>"; // 现在当前元素是 Steve
echo prev($people) . "<br>"; // Steve 的上一个元素是 Bill
echo end($people) . "<br>"; // 最后一个元素是 David
echo prev($people) . "<br>"; // David 之前的元素是 Mark
echo current($people) . "<br>"; // 目前的当前元素是 Mark
echo reset($people) . "<br>"; // 把内部指针移动到数组的首个元素,即 Bill
echo next($people) . "<br>"; // Bill 的下一个元素是 Steve
print_r (each($people)); // 返回当前元素的键名和键值(目前是 Steve),并向前移动内部指针
echo current($people); //现在当前元素是 Mark
echo next($people); //现在当前元素是 Mark
var_dump(next($people)); //false
4.strrchr()与strchr()
从名字可以看出,这两个函数必然有相同的功能点。
strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
注释:该函数是二进制安全的
strrchr(string,char)
参数 | 描述 |
---|---|
string | 必需,规定要搜索的字符串 |
char | 必需。规定要查找的字符。如果该参数是数字,则搜索匹配此数字的 ASCII 值的字符。 |
strchr() 函数搜索字符串在另一字符串中的第一次出现。
注释:该函数是 strstr() 函数的别名。
注释:该函数是二进制安全的。
注释:该函数对大小写感敏。如需进行不区分大小写的搜索,请使用 stristr() 函数。
strchr(string,search,before_search);
参数 | 描述 |
---|---|
string | 必需,规定要搜索的字符串 |
char | 必需。规定要查找的字符。如果该参数是数字,则搜索匹配此数字的 ASCII 值的字符。 |
before_search | 可选。默认值为 “false” 的布尔值。如果设置为 “true”,它将返回 search 参数第一次出现之前的字符串部分。 |
echo strrchr("I love Shanghai!","Shanghai");
/*输出结果是 Shanghai!*/
//以 "e" 的 ASCII 值搜索 "e" 在字符串中的位置,并返回从该位置到字符串结尾的所有字符:
echo strrchr("Hello world!",101);
/*输出结果为 ello world!*/
5. func_get_args()返回一个包含函数参数列表的数组
array func_get_args ( void )
获取函数参数列表的数组。
该函数可以配合 func_get_arg() 和 func_num_args() 一起使用,从而使得用户自定义函数可以接受自定义个数的参数列表。
返回值返回一个数组,其中每个元素都是目前用户自定义函数的参数列表的相应元素的副本。
Note: 该函数仅仅是返回传递参数的一个副本,并且不包含没有传入的默认参数。
function foo()
{
$numargs = func_num_args();
echo "Number of arguments: $numargs<br />\n";
if ($numargs >= 2) {
echo "Second argument is: " . func_get_arg(1) . "<br />\n";
}
$arg_list = func_get_args();
for ($i = 0; $i < $numargs; $i++) {
echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
}
}
foo(1, 2, 3);
/*
Number of arguments: 3
Second argument is: 2
Argument 0 is: 1
Argument 1 is: 2
Argument 2 is: 3
*/
function foo()
{
$numargs = func_num_args();
echo "Number of arguments: $numargs<br />\n";
if ($numargs >= 2) {
echo "Second argument is: " . func_get_arg(2) . "<br />\n";
}
}
foo (1, 2, 3);
/*
Number of arguments: 3
Second argument is: 3
*/
6.array_unshift() array_shift() array_push() array_pop()
参数 | 说明 |
---|---|
array_unshift() | 在数组开头插入一个或多个单元 |
array_shift() | 将数组开头的单元移出数组 |
array_push() | 将一个或多个单元压入数组的末尾(入栈) |
array_pop() | 将数组最后一个单元弹出(出栈) |
- array_shift()
mixed array_shift ( array &$array )
将 array 的第一个单元移出并作为结果返回,将 array 的长度减一并将所有其它单元向前移动一位。所有的数字键名将改为从零开始计数,文字键名将不变。【Note: 使用此函数后会重置(reset())array 指针。】
返回值:返回移出的值,如果 array 为 空或不是一个数组则返回 NULL。
array_unshift()
int array_unshift ( array &array,mixedvar [, mixed $… ] )
array_unshift() 将传入的单元插入到 array 数组的开头。注意单元是作为整体被插入的,因此传入单元将保持同样的顺序。所有的数值键名将修改为从零开始重新计数,所有的文字键名保持不变。
参数:array输入的数组;var开头插入的变量。
返回值:返回 array 数组新的单元数目。
- array_push()
int array_push ( array &array,mixedvar [, mixed $… ] )
array_push() 将 array 当成一个栈,并将传入的变量压入 array 的末尾。array 的长度将根据入栈变量的数目增加。
Note: 如果用 array_push() 来给数组增加一个单元,还不如用 $array[] = ,因为这样没有调用函数的额外负担。
Note: 如果第一个参数不是数组,array_push() 将发出一条警告。这和 $var[] 的行为不同,后者会新建一个数组。
返回:返回处理之后数组的元素个数。
- array_pop()
mixed array_pop ( array &$array )
array_pop() 弹出并返回 array 数组的最后一个单元,并将数组 array 的长度减一。如果 array 为空(或者不是数组)将返回 NULL。 此外如果被调用不是一个数则会产生一个 Warning。
Note: 使用此函数后会重置(reset())array 指针。
返回值:返回 array 的最后一个值。如果 array 是空(如果不是一个数组),将会返回 NULL 。
$arr = range(100,120);
echo array_unshift($arr, "11");
var_dump($arr);
$arr = range(1,10);
echo array_shift($arr);
var_dump($arr);
$arr = range(1,10);
echo array_push($arr, "11");
var_dump($arr);
$arr = range(1,10);
echo array_pop($arr);
var_dump($arr);
/*
22
array (size=22)
0 => string '11' (length=2)
1 => int 100
2 => int 101
3 => int 102
4 => int 103
5 => int 104
6 => int 105
7 => int 106
8 => int 107
9 => int 108
10 => int 109
11 => int 110
12 => int 111
13 => int 112
14 => int 113
15 => int 114
16 => int 115
17 => int 116
18 => int 117
19 => int 118
20 => int 119
21 => int 120
1
array (size=9)
0 => int 2
1 => int 3
2 => int 4
3 => int 5
4 => int 6
5 => int 7
6 => int 8
7 => int 9
8 => int 10
11
array (size=11)
0 => int 1
1 => int 2
2 => int 3
3 => int 4
4 => int 5
5 => int 6
6 => int 7
7 => int 8
8 => int 9
9 => int 10
10 => string '11' (length=2)
10
array (size=9)
0 => int 1
1 => int 2
2 => int 3
3 => int 4
4 => int 5
5 => int 6
6 => int 7
7 => int 8
8 => int 9
*/