PHP自定义函数
自定义函数定义
自定义函数是为了实现某一功能而实现的代码块,定义一次可以多次调用,主要有四部分组成
- 函数名
- 参数
- 逻辑
- 返回值
例如:
function add($num1,$num2){
$num3=$num1+$num2;
return $num3;
}
函数名:add
参数: n u m 1 、 num1、 num1、num2
逻辑: n u m 3 = num3= num3=num1+$num2;
返回值:$num3
注意:自定义函数不一定都包含这四部分的内容,有些函数是没有函数名的,有些函数是没有参数的,有些函数是没有返回值的,可以业务逻辑灵活应用即可
函数的声明与调用
声明函数
关键字:function
函数名:下划线或字母开头(只能有字母、数字、下划线组成)
参数:可有可无
逻辑:实现的功能
返回值:函数处理后返回的结果(可以没有返回值,默认是NULL)
例如
function greet($word){
echo $word;
}
函数名:greet
参数:$word
逻辑:echo $word;
返回值:没有
调用函数
greet('hello php');
输出结果:hello php
扩展知识:
- 函数名推荐使用驼峰式命名
- 定义的函数具有全局作用域
- 函数不支持重载
- 已经定义的函数不能重定义
- 不能取消已经定义的函数
变量的作用域
php中变量的作用域有以下三种情况
局部变量
在函数内部定义的变量成为局部变量,作用域在函数内有效,函数执行结束后便被回收。
function showNum(){
$num=1;
echo $num;
}
以上例子中, n u m 是 在 s h o w N u m 函 数 内 定 义 的 , 所 以 num是在showNum函数内定义的,所以 num是在showNum函数内定义的,所以num是局部变量,在函数内有效,函数外不可以使用,如果你想像以下这样用
function showNum(){
$num=1;
echo $num;
}
echo $num;
php会报一个Notice错误,提示未定义$num.
全局变量
在函数外定义的变量,作用于php文件的生命期(开始执行到结束执行期间),如果先在函数内使用全局变量的话需要通过global或$GLOBALS来实现。
例如
// 全局变量
$num=1;
/**
* 自定义函数
*/
function showNum(){
// 函数内使用全局变量
global $num;
echo $num;
}
// 调用自定义函数
showNum();
或者
// 全局变量
$num=1;
/**
* 自定义函数
*/
function showNum(){
// 函数内使用全局变量
echo $GLOBALS['num'];
}
// 调用自定义函数
showNum();
超全局变量
在函数内外都可以直接使用的变量,作用于php文件的整个生命周期,常用的超全局变量包括
$_GET;
$_POST;
$_SERVER;
$_SESSION;
$_COOKIE;
$_REQUEST;
$_FILES;
$GLOBALS;
$_ENV;
函数的参数
为函数提供额外的信息
function greet($name){
echo 'hello '.$name;
}
greet('Trevor');
以上例子中,$name为参数,给greet提供了数据,所以可以在函数内部直接使用。
参数可以为零,也可以多个
函数的参数是不固定的,根据自己的业务实现。
function say(){
echo 'hello php';
}
function add($num1,$num2){
echo $num1+$num2;
}
可以为任意的数据类型(不包括资源类型)
可选参数与必选参数
有默认值得参数为可选参数,没有默认值的参数为必选参数。必选参数在调用时一定要填写,可选参数可以不填写,不填写时采用定义函数时的默认参数。
function showGrade($score,$subject='php'){
echo $subject.':'.$score;
}
以上例子中, s c o r e 为 必 选 参 数 , score为必选参数, score为必选参数,subject为可选参数。
函数的形参与实参
形参
定义函数时的参数称为形参。
实参
调用函数时传递给函数内部使用的参数称为实参。
引用传递
调用函数时使用的是地址传递,传递的是该参数的地址,在函数内部改变传递的参数时会改变原生的值。
$num=1;
function changeNum(&$num){
$num=$num+1;
}
changeNum($num);
echo $num;
在以上例子中, n u m 为 引 用 传 递 , 在 c h a n g e N u m 函 数 中 做 了 + 1 操 作 , 该 操 作 会 直 接 影 响 到 函 数 外 的 num为引用传递,在changeNum函数中做了+1操作,该操作会直接影响到函数外的 num为引用传递,在changeNum函数中做了+1操作,该操作会直接影响到函数外的num的值,所以echo的值为2.
可变参数
定义函数时,如果无法确定该函数的参数个数,比如计算一个数列的平均值或总和之类的功能,这是我们就可以使用可变参数来定义该函数了。
获取函数的所有参数
func_get_args();
获取函数中的第n参数
func_get_arg(1);
1是表示获取第二个参数,因为编程是从0开始计数的
获取参数的个数
func_num_args();
例子
function countAvg(...$args)
{
$params = func_get_args();
$num=func_num_args();
echo array_sum($params)/$num;
}
countAvg(2,4,6,8);
函数的返回值
- 可以没有return语句,没有时的默认返回值为NULL
- 返回值可以是任意数据类型(不包括资源类型)
- 使用return语句时将终止函数执行并将控制权转回调用该函数的代码行
匿名函数和回调函数
匿名函数:没有函数名的函数
$user=function ($name){
echo 'Hello I am '.$name;
};
$user('Trevor');
回调函数:将另一个函数作为参数传递给函数使用
function user($name){
echo 'Hello I am '.$name;
};
call_user_func('user','Trevor');
注:
call_user_func('functionName',$param1,$param2,...); // 参数以参数列表的形式传递 call_user_func_array('functionName',[$param1,$param2,...]);//参数以数组的形式传递
内部函数和有条件函数
内部函数:在函数内部定义的函数
function people(){
echo 'I am a person.';
function name(){
echo 'My name is Trevor.';
}
}
people();
name();
注:内部函数只有在外部函数被调用后才生效
条件函数:条件成立的时候定义的函数
$machine='plane';
if($machine=='plane'){
function fly(){
echo 'I can fly quickly';
}
}
fly();
注:条件函数只有在条件后才生效,条件不成立时调用该函数的话会报错
递归函数
满足条件时,自己调用自己的函数称为递归函数。
比如遍历当前文件夹及子目录并生成文件树
function create_dir_tree($flig = 0,$j = '',$dir = './'){
if(is_dir($dir)){
if($handle=opendir($dir)){
while(($file_dir=readdir($handle))!==false){
if(is_dir($dir.'\\'.$file_dir)){
echo $j.'└── '.$file_dir."\n";
create_dir_tree(
$flig + 1,
str_pad($j,$flig + 1 ,"\t"),
$dir.'\\'.$file_dir);
}else{
echo $j.'├── '.$file_dir."\n";
}
}
}
}
}
create_dir_tree();
可变函数
变量后面带有(),php会先解析变量的值,然后将其作为函数来调用。
function study(){
echo 'I am studying php';
}
$learn='study';
$learn();