PHP学习4
函数
函数形参的默认值问题
我们可以给一个函数定义时的形参,赋值一个“默认值”,则这个函数调用的时候,该形参对应的实参,可以不给值。
形参的传值问题
一句话:形参的传值问题,其实就是“变量之间的传值问题”:
其实无非就是实参变量,传值给形参变量的问题。
即:
此时,也同样有两种传值方式:
值传递:
这是默认值。如果没有特别设定,参数传值都是值传递。
引用传递:
需要在形参的前面加 &符号:
函数参数的数量问题
1,通常,函数调用时的实参数量,应该跟函数定义时的形参数量保持一致。
2,如果函数定义时,形参有默认值,则对应的实参就可以进行一定程度的省略:
注意:省略只能从右往左进行。
3,有一种定义和使用函数的特别形式(并不常见):它不定义形参,而实参任意给出。
其实,系统中也有类似的函数:,比如:
var_dump($v1);
var_dump($v1, $v2, $v3); //ok!
可见,该函数就可以接受任意个数的实参;
我们自己也可以定义这种函数。其实,这种函数,依赖的是以下3个系统函数来获取相应的信息,以得到实参数据的处理:
1: func_get_args(); //获取实参数据列表,成为一个数组
2: func_get_arg($i); //获取第$i个实参数据,$i从0开始算起;
3:func_num_args(); //获取实参的数量(个数)
函数的其他形式:
可变函数
先想想可变变量:
$v1 =”abc”;
$abc = 123;
echo $$v1; //输出123,这就是所谓的可变变量。
可变变量:一个变量的名字还是一个变量!
可变函数:一个函数的名字是一个变量!
1 function f1(){ 2 echo "<br />这是一个普通的函数而已!"; 3 } 4 $v1 = "f1"; 5 $v1(); //这就是可变函数! 6 //可变函数其实就是在调用函数的时候,使用一个变量名而已。 7 //该变量的内部,就是该函数名! 8 9 10 function jpg(){ echo "<br />处理jpg图片";} 11 function png(){ echo "<br />处理png图片";} 12 function gif(){ echo "<br />处理gig图片";} 13 $file = "abc.png";//代表用户上传的图片; 14 //其后缀肯能是png,jpg,gif等 15 $houzhui = strrchr($file, "."); 16 //strrchr($s1,$s2)函数用于获取字符串$s1中最后一次 17 //出现的字符$s2之后的所有字符内容(含$s2本身) 18 //echo "<br />$houzhui";//这里输出是:“.png" 19 $houzhui = substr($houzhui,1);//获得该字符串从位置1开始之后的所有字符 20 //此时$houzhui就是类似这样:"png" 21 $houzhui(); //可变函数!
匿名函数
匿名函数就是没有名字的函数。
有2种形式的匿名函数:
1 <?php 2 //将一个匿名函数,赋值给一个变量f1 3 $f1 = function () { 4 echo "<br />这是一个匿名函数!"; 5 }; 6 $f1(); //调用该匿名函数,就使用该变量 7 //可见其形式跟调用可变函数一样! 8 9 //在演示一个带参数的匿名函数: 10 $f2 = function ($p1, $p2) { 11 $result = $p1 + $p2; 12 return $result; 13 }; 14 $re1 = $f2(3, 4); //将函数的返回值赋值给$re1; 15 echo "<br />re1 = $re1"; 16 17 echo "<hr />"; 18 function func1($x, $y, $z) 19 { 20 $s1 = $x + $y; 21 $s2 = $x - $y; 22 $z($s1, $s2); 23 } 24 25 func1(3, 4, 26 function ($m1, $m2) { 27 $n = $m1 * $m2; 28 echo "<br />两个数是和乘以2个数的差的结果为:$n"; 29 } 30 ); 31 32 func1(3, 4, 33 function ($m1, $m2) { 34 echo "<br />m1=$m1, m2 = $m2"; 35 } 36 ); 37 ?>
变量的作用域问题
变量的作用域,就是指:一个变量,在什么范围中可以使用的情况。
php中,有3中变量作用域:
局部作用域:
就是指一个函数的内部范围。
对应这样的变量,就称为“局部变量”;
超全局作用域:
就是指所有的代码范围。
对应这样的变量,就称为“超全局变量”;
其实只有系统预定义的几个:$_GET, $_POST, $_SERVER, $_REQUEST, $GLOBALS, $_SESSION, $_COOKIE, $_FILES
全局作用域:
就是不在函数内部的范围——函数外部。
对应这样的变量,就称为“全局变量”;
1 <?php 2 //这里演示局部访问全局变量,出错: 3 $v1 = 1; 4 function f1(){ 5 echo "<br />在函数内部访问外部:v1 = $v1;"; 6 } 7 f1(); 8 9 10 //这里演示全局访问局部变量,出错: 11 function f2(){ 12 $v2 = 1; 13 } 14 f2(); 15 echo "<br />在函数外部访问局部变量:v2 = $v2;"; 16 17 echo "<hr />"; 18 function f3(){ 19 static $c = 0;//静态局部变量,它的值会保留 20 //而且,此行的赋初值,只会执行第一次 21 $c++; 22 $d = 0; //此行,每次进入函数,都会执行 23 $d++; 24 echo "<br />c=$c, d=$d, (此函数被调用次数为:$c)"; 25 //到此行之后,函数结束,其中的$d变量就被销毁了! 26 } 27 f3(); 28 f3(); 29 f3(); 30 31 echo "<hr />"; 32 $v4 = 4; 33 function f4(){ 34 //在函数中,使用global来声明一个要使用的全局变量的同名局部变量。 35 global $v4; //这里,$v4是局部变量,只是跟全局的v4同名 36 //实际情况是:此时外部v4变量跟内部的v4变量,共同 37 //指向一个数据区——引用关系! 38 echo "<br />在局部访问全局变量v4 = $v4"; 39 $v4 = 44; //修改其值; 40 } 41 f4(); 42 echo "<br />在全局再次访问v4 = $v4"; 43 44 45 echo "<hr />"; 46 $v5 = 5; //全局变量 47 function f5(){ 48 //$GLOBALS可以认为是全局变量的另一种使用形式! 49 echo "<br />在局部访问全局变量v5 = " . $GLOBALS['v5']; 50 $GLOBALS['v5'] = 55; //修改其值; 51 } 52 f5(); 53 echo "<br />在全局再次访问v5 = " . $v5; 54 echo "<br />在全局再次访问v5 = " . $GLOBALS['v5']; 55 56 57 58 echo "<hr />"; 59 $v6 = 6; //全局变量 60 function f6(){ 61 //$GLOBALS可以认为是全局变量的另一种使用形式! 62 echo "<br />在局部访问全局变量v6 = " . $GLOBALS['v6']; 63 $GLOBALS['v6'] = 66; //修改其值; 64 unset($GLOBALS['v6']); 65 } 66 f6(); 67 echo "<br />在全局再次访问v6 = " . $v6; 68 69 70 ?>
有关函数的系统函数:
- 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