批改状态:合格
老师批语:
1.函数的分类:
1.1:命名函数:会自动提升到php脚本的顶部,可以在全局的任何地方调用,例如:
echo add_num(1,2);//结果是3,证明命名函数可以在全局任何地方使用function add_num(int $a, int $b):int{return $a+$b;};
1.2:匿名函数:也叫闭包函数(closures),临时创建一个没有指定名称的函数,闭包函数可以赋值给一个变量来使用,闭包可以访问函数外部的自由变量,即父作用域中的变量,方法是在函数的()和{}之间用use(),并填上要使用的外部变量,例如:
$name = "Jasper";$age = "18";$about_me = function () use($name, $age){return sprintf('My name is %s, i am %s years old.',$name,$age);};echo $about_me();//运行结果是:My name is Jasper, i am 18 years old.
闭包经常用作函数的返回值,例如:
function closures_demo($userName){//返回一个闭包函数return function ($color) use($userName){return sprintf('<div style="color: %s"; >%s</div>',$color,$userName);};};
此类函数的调用方式可以和js里的柯里化相似:
echo closures_demo("Jasper")("blue");
运行结果如图:
3.函数变量的一些特点:
3.1:函数内部声明的变量叫私有变量,外部不可见,通过return才能在外面访问
3.2:在函数内部访问全局/外部的成员方法有二:
a:使用global
b:$GLOBALS,超全局变量数组是不受使用域限制的,所有的变量都可以以键名的方式在$GLOBALS数组中访问,例如:
$user_name = "Peter";$user_age = "18";function get_userinfo(){global $user_name;return "username is: $user_name , userage is: ".$GLOBALS["user_age"]."<br>";};echo get_userinfo();//运行结果:username is: Peter , userage is: 18
4.函数参数的特点:
4.1:函数的参数分为:
a:必须参数
b:可选参数(给参数设置默认值)
c:不定参数
d:引用参数(在参数前加上&,在函数内部对参数的任何改变都会映射到函数外面的参数中)
四种参数中,不定参数和引用参数挺重要的,必须重点来作个演示以便加强记忆
首先我们演示一下不定参数,在js的学习中我们知道了有function(…rest){}的写法,在php当中同样有,在我们不知道具体应该写多少个参数的时候可以使用此方法:
function add_Numbers(...$Nums){return array_sum($Nums);};echo add_Numbers(1,2,3,4,5,6);//运行结果:21
php中上古时期的方法:
func_num_args():获取输入参数的的个数
func_get_args():获取函数的所有参数
func_get_arg ( int $arg_num ):获取输入参数某个特定位置的值
function add_ns(){$sum=0;for ($i=0;$i<func_num_args();$i++){$sum+=func_get_arg($i);};return $sum;};echo add_ns(1,2,3);//运行结果:6
引用参数,在要引用的参数前加&,这样在函数里对这个参数重新赋值,被引用的值在函数外也会发生变化,例如:
$my_position = "Sichuan";function change_position(string &$my_position){$my_position="Guangdong";};echo "my_position = $my_position <br>";//运行结果:my_position = Sichuan//调用后:change_position($my_position);echo "my_position = $my_position";//运行结果:my_position = Guangdong
如图:
5:静态变量:static
当我们把函数中的一个变量声明为静态变量时,我们在调用函数时静态变量不会随函数的调用结束而消失,它会自动进入到下一次函数调用当中,即可以实现在函数的多次调用过程共享数据,例如:
function sta(){static $a = 1;echo $a,"<br>";$a++;};echo sta();//1echo sta();//2echo sta();//3
6.函数的异步回调执行
因为php是单线程同步执行,如果遇到耗时较多的函数,我们应该将它设置为异步回调执行,方法是:
call_user_func(‘函数名’,”参数列表”);
call_user_func_array(‘函数名’,’参数数组’);
例如:
function greeting(...$names){$n = count($names);$say_hi="";for ($i=0;$i<$n;$i++){$say_hi .="Hi! ".$names[$i]."<br>";}return $say_hi;};echo call_user_func_array("greeting",["小张","小王","小李"]);
执行结果如下图所示:
原则上函数的只有一个返回值的,但是如果我们要返回多个值的时候,只能在返回值的类型上下功夫,例如数组/对象,但是当我们要把返回的值传给前端,接受者是JavaScript,我们可以使用json_encode()方法把值转成JSON字符串进行传输,例如:
function get_user_info(){$u_name = "jasper";$u_age = "18";$u_grade="黄金会员";//第二个参数是为了让它返回中文return json_encode([$u_name,$u_age,$u_grade],JSON_UNESCAPED_UNICODE) ;};var_dump(get_user_info());//string(30) "["jasper","18","黄金会员"]"
在php中解析json字符串我们使用 json_decode()方法:
var_dump(json_decode(get_user_info()));//array(3) { [0]=> string(6) "jasper" [1]=> string(2) "18" [2]=> string(12) "黄金会员" }
如果我们在js中接受来自PHP传输过来的json字符串,我们可以使用:JSON.parse()方法;
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号