参考资料:PHP5 权威编程
![](https://img.haomeiwen.com/i10825669/311f1f8ceda2d3fb.jpg)
PHP 中的函数
函数的定义:function 函数名($形参1,$形参2...){ ...函数体.....}
函数的调用: 函数名($实参1,$实参2....);
注意:实参要和函数的形参一一对应
函数调用的详细过程
1.将函数调用时的实参,传递(赋值)给函数的形参;
2. 在函数内部(可以认为是一个与外界隔离的独立空间),按正常的流程顺序,执行其中的代码,直到结束。
3.如果函数内部有 return 语句,则立即终止函数。
函数的参数:
①函数形参的默认值
![](https://img.haomeiwen.com/i10825669/1afb8b67f208b113.png)
②形参的传值问题:形参的传值问题,其实就是“变量之间的传值问题”,有2种方式
值传递:默认为之值传递
引用传递
![](https://img.haomeiwen.com/i10825669/a3fd629b32127496.png)
值传递的实参变量,在函数内部的形参变量改变了其值,也不会改变该实参变量的值;引用传递的实参变量,在函数内部对应的形参变量的值发生改变,也会改变该实参变量的值。
③函数参数的数量问题
1,通常,函数调用时的实参数量,应该跟函数定义时的形参数量保持一致。
2,如果函数定义时,形参有默认值,则对应的实参就可以进行一定程度的省略:
注意:省略只能从右往左进行。
3.函数参数相关的系统函数
1: func_get_args(); //获取实参数据列表,成为一个数组
2: func_get_arg($i); //获取第$i个实参数据,$i从0开始算起;
3:func_num_args(); //获取实参的数量(个数)
函数的返回值
形式:
function函数名(....){
..........
return 数据;
}
return语句的作用,不管后面跟不跟数据值,都会立即终止函数的执行,返回到函数调用的位置并继续后续工作。
函数的其他形式
可变函数:一个函数的名字是一个变量
![](https://img.haomeiwen.com/i10825669/8990dfd3bf8c969a.png)
匿名函数:没有函数名的函数
形式①将一个匿名函数“赋值”给一个变量——此时该变量就代表该匿名函数了!
$f1 = function(参数1,参数2 ){.......};
$f1( 参数1,参数2 );
形式② 是直接将一个匿名函数,当做“实参”来使用,即回调函数。
![](https://img.haomeiwen.com/i10825669/f262492c327c7c9b.png)
作用域问题
变量的作用域指的是 一个变量,在什么范围内可以使用的情况。
PHP中有3种作用域:1. 局部作用域,是指一个函数的内部范围,对应这样的变量,就称为 局部变量; 2 .全局作用域,是指不在函数的内部范围-----函数的外部,对应这样的变量,就称为 全局变量; 3.超全局作用域,是指所有的代码范围,对应这样的变量,就称为 超全局变量,其实就是系统定义的几个变量,如$_GET,$_POST,$_SEVER,$_REQUEST,$GLOBALS,$_SESSION,$_COOKIE,$_FILE等等.
通常情况下:1.全局范围不能访问局部变量;
2.局部范围不能访问全局变量;
3.函数内部的变量(局部变量),通常在函数调用执行结束后,就被“销毁”了。
4.但有一种局部变量,在函数调用结束后不被销毁:它叫做“静态变量”;
使用形式:
function函数名 (....){
static $变量名 = 初始值; //这就是静态变量!
}
![](https://img.haomeiwen.com/i10825669/33ea9fb0b4f32a89.png)
函数内部的变量,在调用后会被销毁,比如$n2,每次调用后都会被销毁,所以下一次重新调用,初始值还是0,而 静态变量 在调用后不会被销毁,每次调用,初始值就是上次计算后的值;
在局部作用域访问(使用)全局变量
①使用global关键字
![](https://img.haomeiwen.com/i10825669/325ebc9419f8ffc9.png)
在函数中,使用 global 来声明一个 要使用的 全局变量的同名局部变量,函数内的$n1是局部变量,只是跟全局的n1同名; 函数内外的 n1 共同指向一个数据,即它们是 引用关系。 在函数内部修改了这个数据,那么全局里的变量 也就变了。
②使用$GLOBALS超全局变量
![](https://img.haomeiwen.com/i10825669/f733886842788ba7.png)
$GLOBALS对全局变量的使用可以看做是全局变量的另一种语法形式而已,而不是“引用关系”.操作的就是同一个变量。
有关函数的系统函数
function_exists(" 函数名"):判断一个函数是否被定义过。
func_get_arg($i): 获取第i个实参值
func_get_args(): 获取所有实参(结果是一个数组)
func_num_args(): 获取所有实参的个数。
字符串函数
输出与格式化:echo , print, printf, print_r, var_dump.
字符串去除与填充:trim, ltrim, rtrim, str_pad
字符串连接与分割:implode, join, explode, str_split
字符串截取:substr, strchr, strrchr,
字符串替换:str_replace, substr_replace
字符串长度与位置:strlen, strpos, strrpos,
字符转换:strtolower, strtoupper, lcfirst, ucfirst, ucwords
特殊字符处理:nl2br, addslashes, htmlspecialchars, htmlspecialchars_decode,
时间函数
time, microtime, mktime, date, idate, strtotime, date_add, date_diff, date_default_timezone_set, date_default_timezone_get
数学函数
max, min, round, ceil, floor, abs, sqrt, pow, round, rand
有关函数的编程思想
递归思想--------递归函数
递归思想总结:
当面对一个“大问题”,该大问题可以经由该问题的同类问题的“小一级问题”而经过简单计算获得,而且,可以获知(已知)这类问题的“最小一级问题”的答案。则,此时就可以使用递归方法来解决该问题。
则此时该函数的基本模式是:
function digui( $n ){
if(是最小一级){
return已知的答案;
}
$jieguo =对 digui($n-1) 进行简单运算;
return $jieguo;
}
递推(迭代)思想
递推总结:
如果要求一个“大问题”,且该问题有如下2个特点:
1,已知该问题的同类问题的最小问题的答案。
2,如果知道这种问题的小一级问题的答案,就可以轻松求得其“大一级”问题的答案,并且此问题的级次有一定的规律;
则此时就可以使用递推思想来解决该问题,代码模式为:
$qian =已知的最小一级问题的答案;
for( $i =最小一级的下一级; $i <= 最大一级的级次; ++$i){
$jieguo =对 $qian 进行一定的计算,通常需要使用到$i;
$qian = $jieguo;
}
echo “结果为:” . $jieguo;
PHP 中的数组
数组定义: 数组就是一系列数据的集合体;PHP中的数组单元的顺序,与下标无关。
$arr1 = array(1,2,3,4) 常见数组,下标为 默认下标, 就是从 0 开始的整数;
$arr2 = array("a"=>1,"b"=>2,"c"=>3) 关联数组,下标为字符串 ;
$arr3 = array(1=>3,5=>9,0=>19,'aaa'=>88,100);下标可以人为给定,可以数字和字符串混合使用,有标明的下标,也有自动下标,此时下标为 1,5,0,'aaa',6,自动下标为 前面最大数字下标+1,
$arr4 = array(1=>555,8.8=>999);此时下标为 1,8; 浮点数下标只取整数部分;
$arr5 = array(2=>555,true=>9999,6=>11);此时下标为2,1,6;
$arr6 = array(1=>3,5=>7,true=>99);此时下标为1,5,其值为99,7;下标如果又重复,后面的值覆盖前面的值;
$arr7[] = 1; $arr7[] = 2; $arr7[] = 3; 该数组下标为0,1,2
$arr8['aa'] = 1; $arr8['bb'] = 2; $arr8['cc'] = 3; 该数组下标为'aa','bb','cc';
$arr9[1] = 1; $arr9[] = 2; $arr9['dd'] = 3;该数组下标为1,2,‘dd'
还是要注意的,PHP中,数组的单元顺序,是由其 放入 顺序决定的,而不是下标。
数组取值
$n1 = $arr[下标];
数组的分类
①按键值关系来分
索引数组:通常认为,一个数组的下标是严格从0开始的连续的整数,这样的数组成为索引数组。$arr = array(99,33,55,77,88,99,22);
关联数组:通常认为,一个数组的下标都是字符串并一定程度上表明了该单元的含义,则称为关联数组。
$conf = array(
‘host’=>”localhost” ,
‘port’=>3306 ,
‘username’=>’root’ ,
‘password’ => ‘123’
)
混合数组:既有数字下标,也有字符串下标; $arr3 = array(1=>3,4,'aaa'=>88,100);
②按数组的维数(复杂程度)分
一维数组:$arr = array(1,2,45,66)
二维数组: $arr = array(array(1,2),array(2,5),array(99,100))
n维数组 : 接着嵌套
数组的基本使用
![](https://img.haomeiwen.com/i10825669/010f52ef1c70140c.png)
数组的遍历
foreach 基本语法
foreach ($数组名称 as $key => $value) {
这里可以使用$key 和 $value;
$key和 $value 就是该遍历语句一次次取得的数组的每一个单元(项)的下标和对应值。
它总是从数组的开头往后按顺序取数据。
}
数组的指针操作及遍历原理
$arr = array(1=>0,'aa'=>22,5=>9,'bb'=>19,9=>100)
![](https://img.haomeiwen.com/i10825669/4b4b13a3b5a56100.png)
该箭头就是数组内部的所谓 “指针” 的示意图。默认情况下,该指针指向数组的第一个单元。数组的所有有关单元的操作,如果没有指定下标,则就是针对该指针指向的单元的操作。
所谓遍历,就是一次次取得当前单元的 键 和 值,并放入对应的变脸$key ,$value,然后移动指针到下一个单元。
指针函数:
$v1 = current( $数组);//获取数组当前指针所在单元的 ‘值’;
$v2 = key( $数组);//获取数组当前指针所在单元的 ‘键’(下标);
$v3 = next( $数组);//先将数组的指针向 后 移动一个单元,然后获取数组当前指针所在单元的 ‘值’;
$v4 = prev( $数组);//先将数组的指针向 前 移动一个单元,然后获取数组当前指针所在单元的 ‘值’;
$v5 = end( $数组);//将数组的指针直接移动到 最后 ,然后获取数组当前指针所在单元的 ‘值’;
$v6 = reset( $数组);//将数组的指针直接移动到 第一个单元 ,然后获取数组当前指针所在单元的 ‘值’;
使用 for 和 next 遍历数组
![](https://img.haomeiwen.com/i10825669/b933a3a57ca9bae9.png)
while+each( )+list( ) 遍历数组
each( )函数的作用:先取得一个数组的“当前单元”的下标和值(并放入一个数组),然后将指针移到下一个单元。
$a = each($数组名); //返回的 $a 就是一个数组了
![](https://img.haomeiwen.com/i10825669/b9ffadbf2c128548.png)
list()函数的作用:用于一次性取得一个数组中从0开始的连续的数字下标的多个单元的值!
list($变量1,$变量2,$变量3, .. ) = $数组;
上述一行代码相当于如下代码:
$变量1 = $数组[0];
$变量2 = $数组[1];
$变量3 = $数组[2];
![](https://img.haomeiwen.com/i10825669/d0ea8047f77c2381.png)
while + list + each 遍历数组实例
![](https://img.haomeiwen.com/i10825669/ce0c346834d12dac.png)
数组的一些注意事项:
1.foreach循环中中可以使用 break 和 continue;
2.遍历过程中值变量默认的传值方式是 值传递。
![](https://img.haomeiwen.com/i10825669/ce118cc546462e63.png)
foreach 中修改了value 的值,但是数组并没有过改变;
3.遍历过程中值变量可以人为设定为引用传递:foreach($arr as $key =>&$value){ ... }
![](https://img.haomeiwen.com/i10825669/c0ff172b44ace3d3.png)
foreach 中修改了value 的值,数组也改变;但是键值 $key 并不能修改。
4.foreach 默认是原数组上进行遍历。但如果在遍历过程中对数组进行了某种修改或某种指针性操作,则会复制数组后在复制的数组上继续遍历循环(原数组保持不变)。
![](https://img.haomeiwen.com/i10825669/44dcb678639ab581.png)
改变数组的时候($arr[6] = 1000),先将数组复制一份,在复制的数组上进行遍历。因此,echo 的时候并没有 6=>1000.
5.foreach中如果值变量是引用传递,则无论如何都是在原数组上进行。
![](https://img.haomeiwen.com/i10825669/936a15f2786130c9.png)
网友评论