Correction status:qualified
Teacher's comments:php中的函数知识还有很多, 更多可以查阅官方手册
PHP函数的默认参数
定义函数形参时可以设置默认参数,当函数被调用未传参时会使用默认参数。有传参时会优先传参值。
<?php //演示默认参数 //定义函数sum求和 有$a、$b 2个参数均设置了默认值5 function sum($a=5,$b=5){ return $a+$b; }; //函数调用 我不传输任何参数 但是函数会返回10 因为有2个默认参数 echo sum(),'<hr>'; //我值传一个值 此时结果是15 参数会代替默认参数 也就是$a是10 echo sum(10),'<hr>'; //当传入2个值时候 分别以我传参为优先级最高 来计算。 echo sum(10,10),'<hr>'; //当参形参自定义后 要按照顺序传入参数
点击 "运行实例" 按钮查看在线实例
PHP剩余参数
可以支持部分参数以数组的方式传入 适合有大量参数时候使用。
<?php //演示 剩余参数:可变长参数 function sum3($a,$b,...$c){ return $a+$b+array_sum($c); }; echo sum3(5,5,10,10,10),'<hr>'; //根据剩余参数特性可以将部分参数从外部数组直接获取 function sum4($a,$b,...$arr){ return $a+$b+array_sum($arr); }; $arr=[20,20,20]; echo sum4(5,5,...$arr),'<hr>'; //限制返回值 限制第一个参数为int整数 '6'运算时候会自动转换成数字 不能转换的会忽略不会报错 function sum5(int $a,$b,...$arr){ return $a+$b+array_sum($arr); }; $arr=[6,'p6d','6lang']; echo sum3(5,5.2,...$arr),'<hr>'; //上面数组中 虽然出现了 字符串 但是并不会报错 不能转换为数组的 只是不进行计算而已。
点击 "运行实例" 按钮查看在线实例
PHP匿名函数
<?php //匿名函数 //匿名函数 函数表达式 $sum=function($a,$b){ return $a+$b; }; //调用输出 echo $sum(2,3),'<hr>';
点击 "运行实例" 按钮查看在线实例
PHP匿名函数获取外部数据
<?php // 匿名函数获取外部数据 $str='我是全局变量中的一段文字。11111'; $str2='我是全局变量中的一段文字。22222'; //在匿名函数中可以通过 use($var)将全局变量 传值 获得值(函数内修改不影响全局) $func1=function() use($str){ $str1='我想看看外面的世界~'; return $str; }; echo $func1(); $str='我是全局变量中的一段文字。11111'; //在匿名函数中可以通过 use(&$var)将全局变量 引用传递(传址)调用(函数内修改影响全局) $func2=function() use(&$str2){ $str2='我被刁民 func2 使用了& 把我给顶替了~'; return $str2; }; echo $func1(),'<hr>'; echo $func2(),'<hr>'; //函数允许嵌套调用 function demo(){ $name='大灰狼 函数嵌套调用'; return function() use($name){ return $name; }; }; //因为demo返回的是一个函数 所以得先放到一个变量中 在运行 $f1=demo(); echo $f1(),'<hr>'; //也可以简化为 echo demo()();
点击 "运行实例" 按钮查看在线实例
call_user_func_array()的常用场景
// 语法 call_user_func_array($callback, $param_arr);
常用场景如
1、需要调用的函数名是未知的;
2、要调用函数的参数类型及个数也是未知的;
//实际使用 function sayEnglish($fName, $content) { echo 'I am ' . $content; } function sayChinese($fName, $A, $B) { echo $A . $B; echo "<br>"; } function say() { $args = func_get_args(); call_user_func_array($args[0], $args); } say('sayChinese', '我是', '中国人'); say('sayEnglish', 'Chinese'); //改进----------------------------------------------------- echo '<hr>'; function sayEnglish2(...$arr) { echo 'Americans say: <pre>' .print_r($arr,true); } function sayChinese2(...$A) { echo '中国说:<pre>'.print_r($A,true); echo "<br>"; } function say2($fname,...$arr) { call_user_func_array($fname, ...$arr); } say2('sayChinese2', ['我是中国人', '我不姓福','但是我日子幸福']); say('sayEnglish2', ['Chinese','good']); //say($funcName,$conterArr);
点击 "运行实例" 按钮查看在线实例
动态调用普通函数时,比如参数和调用方法名称不确定的时候很好用。
函数名可以用参数的方式传递进去,因而调用不同函数。 配合func_get_args()或剩余参数 接收参数到数组中,参数的个数也可以不一致。
不需要判断函数类型,无论是普通函数,类的静态方法或者类的方法,均直接调用,不用去判断方法的类型。