函数的定义:函数就是一段封装好的代码块,可以随时调用。在PHP中有两种函数:自定义函数与系统函数。
自定义函数语法格式:
function 函数名称([参数1,[参数2]....])
{
函数体(程序内容叙述)
[return 返回值;]
}
注:[]里的东西可有可无
自定义函数的名称:
- 它是函数在程序代码中的识别名称,函数名可以是以字母或下划线开头后跟零个或多个字母、下划线和数字的任何字符串。
- 符合变量名的命名规则
- 函数名不区分大小写。
- 函数名不能重复,命名函数函数时不可使用已经声明的函数(这个和变量的命名不同,变量可以覆盖前一个变量名,而函数不可以),和PHP系统函数名称。
参数(可以分为形参和实参):
所谓参数就是:用来把数值从函数外部传入函数体中,并用来加以运算处理。
参数之间用“,”隔开,当函数不需要任何数值传入时,可以省略参数。
形参:声明函数时,函数名后面括号内的表达式称为形参。
function table(形参1,形参2){}
实参:被调用函数名后面括号中的表达式称为实参。
table(实参1,实参2);
实参和形参需要按顺序对应传递数据。
function table2($rows,$cols,$color='yellow'){ echo '<table border="1" bgcolor="'.$color.'">'; for($i = 0;$i < $rows;$i++){ echo '<tr>'; for($n = 0;$n <$cols;$n++){ echo '<td>'.($i*$rows+$n).'</td>'; } echo '</tr>'; }}table2(10,10,'red');
注意:函数参数中,没有默认值的放到前面,有默认值的放在参数列表中的后边。
table2($rows,$cols,$color = 'yellow')
返回值:
当调用函数时需要它返回一些数值,那么就要在函数体中用return语句实现。
格式如下:
return 返回值;//返回值可以是变量也可以是一个表达式
exit(); //无返回值 void
return语句在函数体中使用时,有以下两个作用:
- return语句可以向函数调用者返回函数体中任意确定的值。
- 将程序控制权返回到调用者的作用域,即退出函数。在函数中如果执行了return语句,它后面的语句就不会被执行了。
说明:如果函数没有返回值,就只能算是一个执行过程,只依靠函数做一些事情还不够,有时更需要在程序脚本中
使用函数执行后的结果。由于变量的作用域的差异,调用函数的脚本程序不能直接使用函数体里面的信息,但可以通过关键字return向调用者传递数据。
echo与return:
echo直接输出到浏览器,不能再加工,不能赋值给变量
return可以赋值给变量,变量是数据的临时容器(return返回一个值,等待一个变量接收它)
注意: 如果函数有返回值,当函数执行完毕时就会将return后面的值返回到调用函数的位置处,这样就可以把函数名称当作函数返回的值使用。(这时调用函数时对ruturn后面的值是不管用的(retrun的值已经返回到调用函数的位置处,return以前的输出还是可以照样输出),因为她已经变成某个值了无法用funName();输出,需要echo funName()才可以输出。)
<?phpheader("content-type:text/html;charset=utf-8");//在函数的声明之前调用echo show();echo '<hr>';function show(){ echo 'ccc';
return 'aaa';
//return所在行之后的代码不会执行 echo 111;}//函数的调用,不会将return后面的值返回show();echo '<hr>';//return返回的值 需要一个变量来接收它$result = show();echo $result;echo '<hr>';
//也可以直接输出 函数名称echo show();echo '<hr>';
输出结果:
cccaaa
ccc
cccaaa
cccaaa
函数的调用:
格式:函数名();
说明:table();
- 不管是自定义函数还是系统函数,如果函数不被调用,就不会执行。
- 通过函数名称去调用函数,并让函数体的代码运行,调用几次函数体就会执行几次。
- 在PHP中可以在函数的声明之后调用,也可以在函数的声明之前调用,还可以在函数中调用函数。
驼峰命名法:
function showInfo(){ }function ShowInfo(){ }
判断函数是否存在: function_exists()
if(function_exists('table')){ echo 'table';}else{ echo 'table函数不存在,请先定义table函数';}
PHP变量的范围:
- 局部变量
- 全局变量
- 静态变量
<?php$username = 'shifang';function stu(){ $name = 'libai'; echo $name;
//无法调用外部的$username,而在函数体内也没有声明$username10 echo $username; echo 'xxxx';}stu();
//函数体外无法调用函数体内的变量16.echo $name;echo $username;
结果:
libai
Notice: Undefined variable: username in D:\xampp\htdocs\89\Exercise\2014-7-28 PHP function\007quanju.php on line 10
xxxx
Notice: Undefined variable: name in D:\xampp\htdocs\89\Exercise\2014-7-28 PHP function\007quanju.php on line 16
shifang
在PHP的页面中声明的变量,叫“全局变量”.
函数内的变量叫“局部变量”.
二者没有半毛钱关系:函数内的变量,外部无法调用,函数外的变量,函数无法调用
(某戏班子到某学校唱戏,两者的花名册都不可相互调用)
静态变量:
- PHP支持声明函数变量为静态的(static)。
- 一个静态变量在所有对该函数的调用之间共享,并且仅在脚本的执行期间函数第一次被调用时被初始化。
- 要声明函数变量为静态的用关键字static,通常,静态变量的第一次使用时赋予一个初始值。
<?phpfunction tongji(){ static $n = 0; echo $n; $n++;}tongji();tongji();tongji();echo '<hr>';function jishu(){ $m = 0; echo $m; $m++;}jishu();jishu();jishu();输出结果:0123
00000
函数内如何调用函数外的变量?
1、传参
2、引用传参---"&"
下边的两种方法不推荐使用,因为其破坏了函数的封装性
3、声明全局变量 global
function t2()
{ global $a;echo $a;}t2();
4、超级全局变量,在页面的任何部分,包括函数,方法等,都可以直接访问
$GLOBALS
超级全局变量(9个):
- $_GET //地址栏上获得的值
- $_POST //POST表单发送的数据
- $_REQUEST //既有GET,也有POST的内容,需要在php.ini中配置
- $_SESSION
- $_COOKIE
- $_FILES
- $_ENV //服务器操作系统的环境变量,如操作系统,Linux,win ,mac,环境变量等等;容易暴露服务器信息,一般不允许显示,需要在php.ini中配置
- $_SERVER //获取网站的域名,以及当前访问的脚本,客户端IP(REMOTE_ADDR,HTTP_X_FORWARD_FOR)
- $GLOBALS //是对全局变量花名册的一个别名,通过该变量,可以任意访问全局变量
<?php
//使用returnfunction show(){ $username = 'dufu'; return $username;}//输出dufuecho show();echo '<hr>';$username = 'xiao';echo $username;echo '<hr>';function getData()
{ return $GLOBALS['username'] = 'libai';}//无法输出getData();echo '<hr>';$result = getData();echo $result;echo '<hr>';echo getData();echo '<hr>';//超全局变量,不仅可以获取外边的变量,还可以改变变量的值echo $username;echo '<hr>';
输出结果:
dufu
xiao
libai
libai
libai
PHP函数的各种形式(分类):
- 常规参数函数
- 伪类型参数函数 mixed number callable | callback
- 默认参数函数 function table($rows,$cols=3,$color= 'red');
- 可变长度参数函数 func_get_args() func_get_arg(1) func_num_args();
- 引用参数函数 function mysort(&$arr){};
- 回调函数 usort(), uksort(),
- 递归函数
- 匿名函数
1、常规参数函数
格式说明:
string example(string name, int age, double height)
所谓的常规参数函数就是实参和形参应该个数相等,类型一致。
<?php
{ echo '<table border="1" bgcolor="'.$color.'">'; for($i = 0;$i < $rows;$i++){ echo '<tr>'; for($n = 0;$n <$cols;$n++){ echo '<td>'.($i*$rows+$n).'</td>'; } echo '</tr>'; }}table2(10,10,'red');
2、伪类型参数函数
主要用于查看手册时,查看各种需要的类型,在实际的代码中很少用到,有这么概念就行,伪类型可以理解为什么类型都可以。
格式说明:
mixed funName(mixed $args) #在参数列表中出现类型使用 mixed 描述的参数number funName(number $args) #在参数列表中出现类型使用 number 描述的参数
PHP中函数的每个参数,都可以为其传递任意类型的值。
PHP的伪类型,包括mixed(任意类型)、number(int ,float)、callback(函数名)三种。
3、默认参数函数
格式说明:mixed funName(string name[,string value[,int expire]]) #在参数列表中出现使用[ ]描述的参数
<?php
//一个函数:只要有一个参数有默认值,该函数就叫默认参数函数//默认参数:有默认值的参数放在 参数列表 后面,前面的 形参个数 要求与 传入实参 时的 个数和类型必须一致function table($rows = 10,$cols = 10,$color = 'red'){ echo '<table border="1" bgcolor="'.$color.'">'; for($i = 0; $i < $rows; $i++){ echo '<tr>'; for($n = 0; $n < $cols; $n++){ echo '<td>'.($i*$cols+$n).'</td>'; } echo '</tr>'; } echo '</table>';}table(3,3,'blue');table();
4、可变长度参数函数
格式说明:
mixed funName(string arg1 [,string...]) #在参数列表中出现使用“...”描述的参数
使用默认参数函数适合实参个数少于形参的情况,而可变长度参数函数则适合实参个数多于形参的情况。
如果希望函数可以接受任意数量的参数,需要在函数中使用PHP系统提供的func_get_args()函数,它将所有传递个脚本函数的参数当作一个数组返回。
获取所有传入的参数:func_get_args();
获取所有传入参数的个数: func_num_args();
单独获取指定的参数: func_get_arg(n);
<?php//可变长度参数函数:传入的参数个数是不确定的function show(){ //获取所有传入的参数,并将其转为一个数组返回 $arr = func_get_args();
//输出的$arr为数组
//获取所有传入参数的个数 echo func_num_args();
//单独获取指定的参数,需要传入参数的顺序号,从0开始 echo func_get_arg(3);}show('a','n','x','y','z');function getInfo(){ $num = func_num_args(); for($i = 0;$i < $num;$i++){ echo func_get_arg($i).'<br>'; }}getInfo('姓名:小二','年龄:18','aihao:nvkeguan','teshuaihao:hejiu');
输出结果:
5
Array ( [0] => a [1] => n [2] => x [3] => y [4] => z )
y
姓名:小二
年龄:18
aihao:nvkeguan
teshuaihao:hejiu
5、引用参数函数
格式说明:void funName(array &arg) #在参数列表中出现使用 & 描述的函数
<?php$arr = array(98,66,1,23,12,5);
function show(&$crr){ for($i = 0;$i <4; $i++){ ($crr[$i] += 5).'<br>'; }}//$crr = &$arr;$arr是数组所以无法输出数组?show($arr);
echo '<pre>';print_r($arr);echo '<hr>';echo '<pre>';sort($arr);print_r($arr);
输出结果:
Array
(
[0] => 98
[1] => 66
[2] => 1
[3] => 23
[4] => 12
[5] => 5
)
Array
(
[0] => 103
[1] => 71
[2] => 6
[3] => 28
[4] => 12
[5] => 5
)
Array
(
[0] => 5
[1] => 6
[2] => 12
[3] => 28
[4] => 71
[5] => 103
)
100
200100
Notice : Undefined variable: var in D:\xampp\htdocs\89\HomeWork\moxie\yinyon.php on line 28
100
200200
6、回调参数函数
格式说明:
mixed funName( callback arg ) #在参数列表中使用伪类型 callback 描述
所谓回调函数,就是指调用函数时并不是传递一个标准的变量作为参数,而是将另一个函数作为参数传递到调用的函数中。
函数参数中,有一个参数值是另一个函数的函数名,那么这个函数就是回调函数
如果在函数的格式说明中,出现“callback”类型的参数,该函数就是回调函数。
callback也属于PHP中伪类型的一种,说明函数的参数需要接受另一个函数作为实参。
使用回调函数的目的是可以将一段自己定义的功能传到函数内部使用。
- 变量函数
- 2使用变量函数声明和应用回调函数
- 3借助call_user_func_array()函数自定义回调函数
- 格式说明:mixed call_user_func_array(callback function,array param_arr)
- 该函数有两个参数,第一个参数因为使用伪类型callback,所以这个参数需要是一个字符串,表示要调用的函数名,第二个参数则是一个数组类型参数,表示参数列表,按照顺序依次会传递给要调用的函数。
$msg12=兄弟连
- 4静态类函数和对象的方法回调
<?phpecho '<pre>';$arr = [199,1,24,789,213,123];usort($arr,'myfun');function myfun($x,$y){ return $y-$x;}print_r($arr);
结果:Array( [0] => 789 [1] => 213 [2] => 199 [3] => 123 [4] => 24 [5] => 1)
<?php$bianliang = 'myfun';function myfun(){ echo 'this is a function';}// myfun();//$bianliang();//自定义的回调函数function show($func){ //myfun(); $func();}show('myfun');结果:this is a function
7、递归函数
递归函数即自调用函数。
<?php
结果:
9876543210<=======>0123456789
8、匿名函数
1、它没有函数名
2,可以赋值给一个变量 $bianliang = function(参数)use(变量){//函数体};
3,所有回调函数中,回调参数位置都可以用匿名函数替代。
4,可以使用use直接调用外部的变量($arr),如果引用外部变量(&$arr),在内部可以更改外部的变量值
<?php//1,第一种用法:将匿名函数数赋值给一个变量,调用的时候 $变量名(参数..);$show = function($a){ echo '代码的处理'; echo $a;};$n = 15;$show($n);
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 |
50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 |
60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 |
70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |
80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 |
90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 |
使用自定义函数库:
include();
require();
include(); require(); 语句是语言结构,不是真正的函数
<?php//包含文件到当前的位置。而 include 只产生警告(E_WARNING),脚本会继续运行。 include '04table.php';//包含文件到当前的位置。require 在出错时产生 E_COMPILE_ERROR 级别的错误。require('04table.php');echo table(5,5);
inculde_once();
require_once();