函数的参数

通过参数列表可以通报信息到函数, 即以逗号作为分隔符的表达式列表。

PHP 支持按值通报参数(默认), 通过引用通报以及默认参数。

php函数自定义PHP 自界说函数和体系函数 CSS

按值通报参数:

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(){}}

设计一个精良的程序, 其函数的定义规范必须知足两个哀求:① 内聚性强 ② 耦合性弱

内聚性强:函数的功能要专一,便是为了完成某个特定功能而实现的。

耦合性弱:函数与函数之间的关系要相对独立, 不存在谁依赖谁的关系。