函数:函数的作用就是完成某一特定功能的代码段
1、自定义函数
function 函数名称(参数){
函数体
}
注意:
函数名称最好以动词开头;
函数名称不区分大小写,调用时保持名称一致;
函数不支持重载,已定义过的函数不可以再以相同命名重新定义;
函数名称不能和系统函数重名;
用于检测函数:
get_defined_functions():得到系统函数和当前脚本中用户自定义的函数的名称,返回的是二维数组
function_exists($functionName):检测函数名称是否存在,如果存在,返回为真;不存在返回为假
func_get_args():获取自定义函数的所有实际参数,返回为数组
func_get_arg(#):获取某一个实际参数的值
func_num_args():获取实际参数的个数
例:
function sum(){
//echo func_num_args();
//echo func_get_arg(0);
$sum=0;
for($i=0,$j=func_num_args();$i<$j;$i++){
$sum+=func_get_arg($i);
}
return $sum;
}
echo sum(1,10,2,20);
2、函数的工作原理
函数声明之后,不调用的情况下不执行;
调用函数通过函数名称();
3、封装函数的好处
代码重用
4、函数的参数
自定义函数可以没有参数;如果有参数,分为:必选参数和可选参数
必选参数在调用的时候一定要传值
可选参数在调用的时候可以不传值,不传值的情况下就使用默认值,传值的时候使用所传的值
必选参数一定要在可选参数之前
5、函数的返回值
函数可以有返回值也可以没有
return 值;
值可以是任意类型
当函数执行函数体的时候,碰到return就立即结束,或者执行到函数末尾的时候就结束
6、函数中声明的变量为局部变量,局部变量在函数体内有效,当函数执行完毕之后就被释放了
函数体外声明的变量是全局变量,但在函数体内想用该全局变量时:
方法一:global $a,$b...; //定义下变量,声明变量是一个全局变量
方法二:$GLOBALS["键名"] --通过下标来取值
例:
$i=1;
$j=1;
function var_global(){
global $i;
echo $i+=1;
echo "<hr>";
echo $j;
}
var_global(); //$i+=1;会正常输出为2,$j因为未在函数内声明,会报错
局部变量=动态变量+静态变量
静态变量:在函数体内通过 static 声明变量为静态变量
第一次调用的时候去声明,当函数体执行结束后会将这个变量的值保存在静态内存中,当你再次调用的时候,首先会将保存在静态内存中的值取出来再去用
例:
function var_static(){
static $i=1;
$j=1;
echo $i+=1;
echo "<br>";
echo $j+=1;
echo "<br>";
}
var_static(); //2 2
var_static(); //3 2
var_static(); //4 2
7、递归函数、变量函数、回调函数
递归函数:函数体自己调用自己本身,用途:在遍历文件目录函数库时用到;
变量函数:把函数名称赋给一个变量,当调用变量的时候:$变量名称(),PHP引擎在解析这个变量的时候会先把它当作函数来解析,就是一个等量代换的过程;
回调函数:把函数名称当作参数传给另一个函数,结合变量函数在函数体内去调用这个函数;
8、函数的传值和传引用
传值在函数体内对变量操作不会影响变量本身;
传引用在函数体内对变量操作会影响变量本身,用 &;
如何调用自定义的函数?
包含自定义函数所在的文件,以便调用该文件中的各函数
require("目标文档的URL") / require "目标文档的URL" (目标文档不存在时,报错并终止程序执行)
include("目标文档的URL") / include "目标文档的URL" (目标文档不存在时,报错并继续执行下面代码)
require_once("目标文档的URL")
include_once("目标文档的URL")
require_once和include_once仅包含一次,若之前已包含就不再包含
require()/include()/require_once()/include_once() 也可用于在一个页面中调用另一个页面
嵌套函数调用时报错的问题:
问题一:
自定义函数A中嵌套包含了自定义函数B,在函数外直接调用函数B,会报函数B未定义的错;在函数外两次及以上调用函数A,会报重定义的错;
问题二:
若分别在两个自定义函数A、B中调用或又自定义了同名函数C,然后在第三个文件中同时引用了自定义函数A和自定义函数B,因这两个自定义函数中同时存在自定义同名函数C,若在第三个文件中同时调用函数A和函数B,会报重定义的错;
function A(){ echo "i'm functionA,"; function C(){ echo "i'm functionC"; } echo "A:"; C(); }
function B(){ echo "i'm functionB,"; function C(){ echo "i'm functionC"; } echo "B:"; C(); }
include "./1.php"; include "./2.php"; //只调用函数A()或只调用函数B()没问题,但同时调用或连续调用2次函数A就会报重复加载的错 A();
A(); B(); //直接调用函数C()就会报函数未定义的错 C();
解决方式:
1.将自定义函数C单独拿出来到第三个文件中定义,与引用的函数A和函数B并列引用,在自定义函数A和自定义函数B中直接调用函数C的函数名
function A(){ echo "i'm functionA,"; echo "A:"; C(); }
function B(){ echo "i'm functionB,"; echo "B:"; C(); }
include "./1.php"; include "./2.php"; function C(){ echo "i'm functionC"; } A(); A(); B(); C();
2.在嵌套函数外利用 function_exists() 函数加一个条件判断即可
function A(){ echo "i'm functionA,"; if(!function_exists("C")){ function C(){ echo "i'm functionC"; } } echo "A:"; C(); }
function B(){ echo "i'm functionB,"; if(!function_exists("C")){ function C(){ echo "i'm functionC"; } } echo "B:"; C(); }
include "./1.php"; include "./2.php"; A(); A(); B(); C();