Blogger Information
Blog 11
fans 0
comment 0
visits 10089
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP函数的返回值与参数,匿名函数与变量作用域的总结与实例
小杂鱼
Original
636 people have browsed it

函数

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 //报错
Correcting teacher:PHPzPHPz

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