博客列表 >PHP函数的返回值与参数,匿名函数与变量作用域的总结与实例

PHP函数的返回值与参数,匿名函数与变量作用域的总结与实例

小杂鱼
小杂鱼原创
2021年08月09日 20:01:31635浏览

函数

1.完成特定功能的代码块;
2.分为命名函数(全局成员不受作用域限制)和匿名函数

命名函数

function 函数名称([参数列表-形参])
{
函数体
return 返回值
}

  1. //不受作用域限制可以在函数上面调用也可以在函数下面调用
  2. demo(222) // 11
  3. function demo()
  4. {
  5. retuen $one / $two;
  6. }
  7. demo(222) // 11

函数返回值

1.return只能返回单个值;如果想返回多个值,可以返回一个数组或对象;
2.return后面的代码不会被执行;

  1. function demo($one, $two)
  2. {
  3. retuen $one / $two;
  4. echo '你好';
  5. }
  6. demo(222) //11;
  7. 没有执行echo输出'你好'

return可以返回的内容

  1. function demo($one, $two)
  2. {
  3. return sha1('www.php.cn');
  4. //string(40) "9210325b59990016a4d9bf6709670b7dc8ab4d02"
  5. return md5('www.php.cn');
  6. //string(32) "372dba858dc62fee52a552a044caa82e"
  7. return 1 == 1;
  8. //bool(true)
  9. return new StdClass();
  10. //object(stdClass)#1 (0) { }
  11. return array('11','22');
  12. //array(2) { [0]=> string(2) "11" [1]=> string(2) "22" }
  13. return 22.22;
  14. //float(22.22)
  15. return '你好';
  16. //string(6) "你好"
  17. return true;
  18. //bool(true)
  19. }
  20. var_dump(demo());

return 返回多个值的方式

  1. //数组
  2. function demo()
  3. {
  4. return ['name' => 'ccc', 'gender' => 'ddd'];
  5. }
  6. $obj = demo();
  7. var_dump($obj);//array(2) { ["name"]=> string(3) "ccc" ["gender"]=> string(3) "ddd" }
  8. echo $obj['name']; //ccc
  9. echo $obj['gender']; //ddd
  1. //对象
  2. function demo()
  3. {
  4. return new class()
  5. {
  6. public $name = 'ccc';
  7. public $gender = 'ddd';
  8. };
  9. }
  10. $obj = demo();
  11. var_dump($obj); //object(class@anonymous)#1 (2) { ["name"]=> string(3) "ccc" ["gender"]=> string(3) "ddd" }
  12. echo $obj -> name; //ccc
  13. echo $obj -> gender; //ddd
  1. //json字符串
  2. function demo()
  3. {
  4. //json_encode(参数)将数组转为json字符串
  5. return json_encode(['status' => 1, 'msg' => '验证成功']);
  6. }
  7. $obj = demo();
  8. var_dump($obj); //string(45) "{"status":1,"msg":"\u9a8c\u8bc1\u6210\u529f"}"
  9. /**
  10. * json_encode(参数,320)将数组转为json字符串,第二个参数320,中文不转为unicode同时不转义反斜杠;
  11. * JSON_UNESCAPED_UNICODE对应数字256 => 中文不转为unicode;
  12. * JSON_UNESCAPED_SLASHES对应数字64 => 不转义反斜杠;
  13. * son_encode(['status' => 1, 'msg' => '验证成功'], 320) => string(33) "{"status":1,"msg":"验证成功"}"
  14. */
  15. var_dump( json_decode($obj); //object(stdClass)#1 (2) { ["status"]=> int(1) ["msg"]=> string(12) "验证成功" } =>是个对象
  16. /**
  17. * json_decode(参数,boolean);将json字符串转为数组
  18. *false 默认值,转为对象;
  19. *true 转为数组;
  20. *json_decode($obj, true); =>array(2) { ["status"]=> int(1) ["msg"]=> string(12) "验证成功" }
  21. */

函数参数

1.可以有多个参数, 以英文逗号 , 隔开;
2.形参可以有默认值;
3.实参会替换掉形参;
4.实参与形参存在从左向右一 一对应, 如果没对应就会报错(实参的第一个值默认对应形参的第一个值);

  1. //形参都没有默认值
  2. function demo($one, $two)
  3. {
  4. return $one + $two;
  5. }
  6. echo demo() //报错
  7. echo demo(12) //3
  8. //形参都有默认值,实参会替换掉形参
  9. function demo1($one = 1, $two = 2)
  10. {
  11. return $one + $two;
  12. }
  13. echo demo1() //3
  14. echo demo1(3, 4) //7
  15. //第二个形参有默认值,实参替换第一个形参,第二个形参使用默认值
  16. function demo2($one, $two = 2)
  17. {
  18. return $one + $two;
  19. }
  20. echo demo2(1) //3
  21. //第一个形参有默认值,实参替换第一个形参,第二个形参没有默认值
  22. function demo3($one = 1, $two)
  23. {
  24. return $one + $two;
  25. }
  26. echo demo3(2) //报错

剩余参数 …

适用于参数个数不确定的时候

  1. //在形参中表示收集的作用,在实参中表示展开的作用
  2. $arr = [555, 666, 777, 888];
  3. function demo(...$args)
  4. {
  5. var_dump($args);
  6. }
  7. demo(111, 222, 333, 444)
  8. //array(4) { [0]=> int(111) [1]=> int(222) [2]=> int(333) [3]=> int(444) }
  9. demo(...$arr)
  10. //array(4) { [0]=> int(555) [1]=> int(666) [2]=> int(777) [3]=> int(888) }

匿名函数

1.匿名函数又叫闭包closure, 指允许临时创建的一个没有名字的函数
2.匿名函数通常需要赋给一个变量,所以匿名函数的作用域问题通常指闭包中变量的作用域问题
3.匿名函数需要在{}花括号后面加;分号
4.闭包通常作为函数的返回值使用;
5.通过引用传值的方式可以改变全局变量上下文的值

  1. //受作用域限制不可以在函数上面调用,只可以在函数下面调用
  2. //echo $demo(1,2); //报错
  3. $demo = function($one, $two)
  4. {
  5. return $one + $two;
  6. };
  7. echo $demo(1,2); //3
  1. //作为函数的返回值
  2. function getInfo($name)
  3. {
  4. return function($gender) use ($name)
  5. {
  6. return "名字叫{$name}, 性别是{$gender}";
  7. };
  8. }
  9. echo getInfo('ccc'); //报错 因为返回的不是字符串而是闭包函数
  10. //解决办法1:直接将第二个参数传进去
  11. echo $getInfo('ccc')('ddd'); ////名字叫ccc, 性别是ddd
  12. //解决办法2:先赋给一个变量再传第二个参数
  13. $closure = getInfo('ccc');
  14. echo $closure('ddd'); //名字叫ccc, 性别是ddd
  1. //改变全局变量的值
  2. $name = 'ccc';
  3. $demo = function($newName) use ($name)
  4. {
  5. $name = $newName;
  6. };
  7. $demo('eee');
  8. echo $name; //ccc 没有改变
  9. //引用赋值&
  10. $demo = function($newName) use (&$name)
  11. {
  12. $name = $newName;
  13. };
  14. $demo('eee');
  15. echo $name; //eee 有改变

变量的作用域

全局变量

函数体外声明的变量
全局变量在函数体内是无法访问的;命名函数解决办法是用关键字global超全局变量$GLOBALS;匿名函数解决办法是用use();

  1. //命名函数
  2. $name = 'ccc';
  3. $gender = 'ddd';
  4. function getInfo()
  5. {
  6. return "名字叫{$name},性别是{$gender}";
  7. }
  8. echo getInfo(); //报错
  9. //使用关键字global
  10. function getInfo_pro1()
  11. {
  12. global $name, $gender;
  13. return "名字叫{$name},性别是{$gender}";
  14. }
  15. echo getInfo_pro1(); //名字叫ccc,性别是ddd
  16. //使用超全局变量$GLOBALS
  17. function getInfo_pro2()
  18. {
  19. return "名字叫{$GLOBALS['name']},性别是{$GLOBALS['gender']}";
  20. }
  21. echo getInfo_pro2(); //名字叫ccc,性别是ddd
  22. //匿名函数
  23. $name = 'ccc';
  24. $gender = 'ddd';
  25. $getInfo = function()
  26. {
  27. return "名字叫{$name},性别是{$gender}";
  28. };
  29. echo $getInfo(); //报错
  30. $getInfo = function() use ($name, $gender)
  31. {
  32. return "名字叫{$name},性别是{$gender}";
  33. };
  34. echo $getInfo(); //名字叫ccc,性别是ddd
局部变量

在函数体内声明的变量
局部变量在函数体外无法访问

  1. function getInfo()
  2. {
  3. $name = 'ccc';
  4. $gender = 'ddd';
  5. return "名字叫{$name},性别是{$gender}";
  6. }
  7. echo getInfo(); //名字叫ccc,性别是ddd
  8. echo $name //报错
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议