PHP自定义函数篇 一时失言乱红尘 2022-12-28 01:35 146阅读 0赞 # PHP自定义函数 # ### 文章目录 ### * PHP自定义函数 * * 自定义函数定义 * 函数的声明与调用 * 变量的作用域 * 函数的参数 * 函数的形参与实参 * 引用传递 * 可变参数 * 函数的返回值 * 匿名函数和回调函数 * 内部函数和有条件函数 * 递归函数 * 可变函数 ## 自定义函数定义 ## 自定义函数是为了实现某一功能而实现的代码块,定义一次可以多次调用,主要有四部分组成 1. 函数名 2. 参数 3. 逻辑 4. 返回值 **例如:** 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 **扩展知识:** 1. 函数名推荐使用驼峰式命名 2. 定义的函数具有全局作用域 3. 函数不支持重载 4. 已经定义的函数不能重定义 5. 不能取消已经定义的函数 ## 变量的作用域 ## 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); ## 函数的返回值 ## 1. 可以没有return语句,没有时的默认返回值为NULL 2. 返回值可以是任意数据类型(不包括资源类型) 3. 使用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();
还没有评论,来说两句吧...