函数的参数
通过参数列表可以通报信息到函数, 即以逗号作为分隔符的表达式列表。
PHP 支持按值通报参数(默认), 通过引用通报以及默认参数。
按值通报参数:
function takes_array($input){echo "$input[0] + $input[1] = ". $input[0]+$input[1];}
通过引用通报参数
通过引用通报参数许可函数修正它的参数值。
function add_some_extra(&$string){$string .= 'and something extra.';}$str = 'This is a string, ';add_some_extra($str);echo $str; // 输出 'This is a string, and something extra.'
把稳:引用通报参数只能通报变量;不能直接传值
默认参数的值
在函数有多个参数的情形下, 任何默认参数必须放在任何非默认参数的右侧;
参数是否带引号,要看参数的变量类型; 字符串的须要带上引号
PHP 还许可利用数组和分外类型 NULL 作为默认参数
function makecoffee($types = array("cappuccino"), $coffeeMaker = NULL){$device = is_null($coffeeMaker) ? "hands" : $coffeeMaker;return "Making a cup of ".join(", ", $types)." with $device.\n";}echo makecoffee();echo makecoffee(array("cappuccino", "lavazza"), "teapot");
返回值 return
在一个函数中调用 return() 语句, 将立即结束此函数的实行并将它的参数作为函数的值返回。
return;
表示没有返回值,直接退出函数
变量的浸染域
php中变量浸染域分3种:
全局浸染域:便是在函数的外部范围
局部浸染域:便是在函数的内部范围
超全局浸染域:包括函数的外部和内部范围。
比拟:js中,没有超全局的观点。
js中,全局浸染域本身就"包括"了局部浸染域,即"全局变量"可以在全局范围或局部范围利用。
函数内部利用外部变量
global关键字:实质是设定一个局部变量来引用某个全局变量(引用传址), 删掉该局部变量,全局变量仍旧存在;
如果修正该局部变量, 全局变量的值也发生变革;
$v1 = 1;function f2(){global $v1;echo "<br />函数内:v1 = $v1";unset($v1);}f2();echo "<br />函数外:v1 = $v1"; //$v1值依然存在
$GLOBALS数组中的元素跟全局变量是逐一对应关系。删掉(unset)一个,另一个也就没有了
$v1 = 1;function f3(){echo "<br />函数内:v1 = {$GLOBALS['v1']}";unset($GLOBALS['v1']);}f3();echo "<br />函数外:v1 = $v1"; //$v1值不存在了
把稳: global引用的全局变量只能在函数外部定义, 否则global引用不到全局变量;
关于$GLOBALS超全局变量与普通变量之间的关系
一个包含了全部变量的全局组合数组 。变量的名字便是数组的键。
<?php$a = 1 ;$b = 2 ;function sum (){$GLOBALS [ 'c' ] = $GLOBALS [ 'a' ] + $GLOBALS [ 'b' ];echo $GLOBALS['c']; //3echo $c; //缺点的语法 Notice: Undefined variable: c/在函数内部还是不能访问, 由于$c已经定义玉成局变量(在函数外), 函数的内部是不能访问全局变量要想访问$c, 须要引入关键字global(引用传址)/global $c;echo $c; //3}sum ();echo $c ; //3 精确的语法, 在函数的外部能访问超全局变量echo $GLOBALS['c']; //3//$GLOBALS — 引用全局浸染域中可用的全部变量?>
特例:静态变量——该变量只在函数调用的第一次进行赋初值,其后再调用,不再赋初值,但可以改变其值,而且,其值在函数结束后,仍旧保留。
<?phpfunction f1(){static $c = 0;$c++;echo "<br/>函数调用了{$c}次";}f1(1); //函数调用了1次f1(2); //函数调用了2次f1(3); //函数调用了3次?>
变量函数(亦称可变函数)
PHP 支持变量函数的观点。这意味着如果一个变量名后有圆括号,PHP 将探求与变量的值同名的函数,并且将考试测验实行它。
除了别的事情以外,这个可以被用于实现回调函数,函数表等等。
function foo() {echo "In foo()<br />\n";}function bar($arg = '') {echo "In bar(); argument was '$arg'.<br />\n";}function echoit($string){echo $string;}$func = 'foo';$func(); // This calls foo()$func = 'bar';$func('test'); // This calls bar()$func = 'echoit';$func('test'); // This calls echoit()
匿名函数:没有名字的函数(php5.3.0新加入的语法)
有两种利用匿名函数的形式, 或说, 匿名函数有两种存在办法:
办法1:
将匿名函数赋值给一个变量, 终极用的时候, 非常类似"可变函数"。如下:
$f1 = function () {}; //把稳,这里末了有一个"分号"——必须的。
上面定义该函数时,没有给名字,那便是匿名函数,并将其整体赋值给了变量$f1;
$f1(); //调用该匿名函数。
<?php$f1 = function(){echo "<br/>匿名函数被调用,参数为:$p1";}; //把稳:这里末了有一个"分号"--必须的$f1(1); //调用该匿名函数$f1(10); //调用该匿名函数?>
办法2:
第二种办法的匿名函数, 基本上只作为"实参"利用。
也便是说, 有一些函数, 实在参哀求是一个"函数"。
把稳:能够利用匿名函数当实参用的函数, 很少很少。
这种函数系统中有这样几个:
call_user_func_array( 匿名函数, 一个数组);
//即函数call_user_func_array带2个参数,第一个参数哀求是一个匿名函数,第二个哀求是数组
//其浸染是:将该数组的所有项,当做该匿名函数的实参传入匿名函数中并实行该匿名函数。
call_user_func_array(function ($p1) {echo "<br />匿名函数被调用,参数为:$p1";}, array(100));
输出结果:匿名函数被调用,参数为:100
递归函数:
递归函数即自调用函数, 在函数体内部直接或间接地自己调用自己, 即函数的嵌套调用是函数本身。
该函数必须有一种能够"停滞调用"的机制,如利用if语句。该机制,被称为递归函数的"出口"。
实例1
function test($n){echo $n." ";if($n>0)test($n-1);elseecho "<-->";echo $n." ";}test(10)
输出结果:10 9 8 7 6 5 4 3 2 1 0 <-->0 1 2 3 4 5 6 7 8 9 10
实例2
function test($n){echo $n." ";if($n>0)test($n-1);elseecho "<-->";}test(10)
输出结果:10 9 8 7 6 5 4 3 2 1 0 <-->
实例3
function test($n){echo $n." ";if($n>0)test($n-1);elseecho "<-->";echo "递归";}test(10)
输出结果:10 9 8 7 6 5 4 3 2 1 0 <-->递归递归递归递归递归递归递归递归递归递归递归
可变长度参数列表
func_num_args()
int func_num_args ( void )
返回通报到函数的参数数目
function foo(){$numargs = func_num_args();echo "Number of arguments: $numargs\n";}foo(1, 2, 3); // 输出 'Number of arguments: 3'func_get_arg()mixed func_get_arg ( int $arg_num )
返回参数列表的某一项
func_get_args()
array func_get_args ( void )
返回一个包含函数参数列表的数组
命名函数须要把稳的事变:
名字不能重复,不能重名。
函数便是一条狗,不叫它名字,它不实行。
函数不要重名,纵然是系统函数
函数不能以数字开始,数字可以接到中间和结尾
不能接分外符号,下划线除外
函数在命名的时候,只有数字,字母,下划线
函数名不区分大小写
函数可以在任意位置调用【把稳】
系统函数的利用
系统函数的把稳事变:
带bool值的, 常日是操作成功没成功, 或者是对不对, 有没有..
如果看到带mixed的是指可以传入任意类型的数据
带&符的只能够传变量, 传了变量后, 如果函数里面改变值, 函数表面也直接改变值
带[ ]的带表可选, 可以传也可以不传
带...的代表可以传入任意多个元素
callback是传回调函数
函数的参数作为变量是区分大小写, 分外的情形将回调函数作为参数可以不区分大小写(如array_filter()、array_walk())
有事没事看手册, 练手当中的函数
bool function_exists ( string $function_name )
判断finfo_open()函数是否存在
if(function_exists('finfo_open')){$finfo = finfo_open ( FILEINFO_MIME_TYPE );}
如果没有开启fileinfo扩展, 则finfo_open()函数不存在;
或者:
if(!function_exists("fastcgi_finish_request")){ //如果函数不存在的话, 就定义一个空函数function fastcgi_finish_request(){}}
设计一个精良的程序, 其函数的定义规范必须知足两个哀求:① 内聚性强 ② 耦合性弱
内聚性强:函数的功能要专一,便是为了完成某个特定功能而实现的。
耦合性弱:函数与函数之间的关系要相对独立, 不存在谁依赖谁的关系。