PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

博客列表 > PHP函数中那些容易忽略的细节

PHP函数中那些容易忽略的细节

Jason Pu?
Jason Pu? 原创
2021年01月29日 12:17:36 578浏览

一.php中函数的参数及作用域

1.函数的分类:
1.1:命名函数:会自动提升到php脚本的顶部,可以在全局的任何地方调用,例如:

  1. echo add_num(1,2);//结果是3,证明命名函数可以在全局任何地方使用
  2. function add_num(int $a, int $b):int
  3. {
  4. return $a+$b;
  5. };

1.2:匿名函数:也叫闭包函数(closures),临时创建一个没有指定名称的函数,闭包函数可以赋值给一个变量来使用,闭包可以访问函数外部的自由变量,即父作用域中的变量,方法是在函数的()和{}之间用use(),并填上要使用的外部变量,例如:

  1. $name = "Jasper";
  2. $age = "18";
  3. $about_me = function () use($name, $age){
  4. return sprintf('My name is %s, i am %s years old.',$name,$age);
  5. };
  6. echo $about_me();//运行结果是:My name is Jasper, i am 18 years old.

闭包经常用作函数的返回值,例如:

  1. function closures_demo($userName){
  2. //返回一个闭包函数
  3. return function ($color) use($userName){
  4. return sprintf('<div style="color: %s"; >%s</div>',$color,$userName);
  5. };
  6. };

此类函数的调用方式可以和js里的柯里化相似:

  1. echo closures_demo("Jasper")("blue");

运行结果如图:

3.函数变量的一些特点:
3.1:函数内部声明的变量叫私有变量,外部不可见,通过return才能在外面访问
3.2:在函数内部访问全局/外部的成员方法有二:
a:使用global
b:$GLOBALS,超全局变量数组是不受使用域限制的,所有的变量都可以以键名的方式在$GLOBALS数组中访问,例如:

  1. $user_name = "Peter";
  2. $user_age = "18";
  3. function get_userinfo(){
  4. global $user_name;
  5. return "username is: $user_name , userage is: ".$GLOBALS["user_age"]."<br>";
  6. };
  7. echo get_userinfo();//运行结果:username is: Peter , userage is: 18

4.函数参数的特点:
4.1:函数的参数分为:
a:必须参数
b:可选参数(给参数设置默认值)
c:不定参数
d:引用参数(在参数前加上&,在函数内部对参数的任何改变都会映射到函数外面的参数中)
四种参数中,不定参数和引用参数挺重要的,必须重点来作个演示以便加强记忆
首先我们演示一下不定参数,在js的学习中我们知道了有function(…rest){}的写法,在php当中同样有,在我们不知道具体应该写多少个参数的时候可以使用此方法:

  1. function add_Numbers(...$Nums){
  2. return array_sum($Nums);
  3. };
  4. echo add_Numbers(1,2,3,4,5,6);//运行结果:21

php中上古时期的方法:
func_num_args():获取输入参数的的个数
func_get_args():获取函数的所有参数
func_get_arg ( int $arg_num ):获取输入参数某个特定位置的值

  1. function add_ns(){
  2. $sum=0;
  3. for ($i=0;$i<func_num_args();$i++){
  4. $sum+=func_get_arg($i);
  5. };
  6. return $sum;
  7. };
  8. echo add_ns(1,2,3);//运行结果:6

引用参数,在要引用的参数前加&,这样在函数里对这个参数重新赋值,被引用的值在函数外也会发生变化,例如:

  1. $my_position = "Sichuan";
  2. function change_position(string &$my_position){
  3. $my_position="Guangdong";
  4. };
  5. echo "my_position = $my_position <br>";//运行结果:my_position = Sichuan
  6. //调用后:
  7. change_position($my_position);
  8. echo "my_position = $my_position";//运行结果:my_position = Guangdong

如图:

5:静态变量:static
当我们把函数中的一个变量声明为静态变量时,我们在调用函数时静态变量不会随函数的调用结束而消失,它会自动进入到下一次函数调用当中,即可以实现在函数的多次调用过程共享数据,例如:

  1. function sta(){
  2. static $a = 1;
  3. echo $a,"<br>";
  4. $a++;
  5. };
  6. echo sta();//1
  7. echo sta();//2
  8. echo sta();//3

6.函数的异步回调执行
因为php是单线程同步执行,如果遇到耗时较多的函数,我们应该将它设置为异步回调执行,方法是:
call_user_func(‘函数名’,”参数列表”);
call_user_func_array(‘函数名’,’参数数组’);
例如:

  1. function greeting(...$names){
  2. $n = count($names);
  3. $say_hi="";
  4. for ($i=0;$i<$n;$i++){
  5. $say_hi .="Hi! ".$names[$i]."<br>";
  6. }
  7. return $say_hi;
  8. };
  9. echo call_user_func_array("greeting",["小张","小王","小李"]);

执行结果如下图所示:


二.让函数返回多个值

原则上函数的只有一个返回值的,但是如果我们要返回多个值的时候,只能在返回值的类型上下功夫,例如数组/对象,但是当我们要把返回的值传给前端,接受者是JavaScript,我们可以使用json_encode()方法把值转成JSON字符串进行传输,例如:

  1. function get_user_info(){
  2. $u_name = "jasper";
  3. $u_age = "18";
  4. $u_grade="黄金会员";
  5. //第二个参数是为了让它返回中文
  6. return json_encode([$u_name,$u_age,$u_grade],JSON_UNESCAPED_UNICODE) ;
  7. };
  8. var_dump(get_user_info());//string(30) "["jasper","18","黄金会员"]"

在php中解析json字符串我们使用 json_decode()方法:

  1. 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()方法;

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议