Blogger Information
Blog 37
fans 1
comment 0
visits 32617
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP函数中那些容易忽略的细节
Jason Pu?
Original
609 people have browsed it

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

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post