博客列表 >PHP基础: 函数作用域与闭包,回调的使用场景与参数调用和函数的多值返回类型方式(重点:json)

PHP基础: 函数作用域与闭包,回调的使用场景与参数调用和函数的多值返回类型方式(重点:json)

zl的php学习博客
zl的php学习博客原创
2021年01月29日 15:09:45871浏览

1.函数作用域

  1. php中函数的作用域有两个,一个函数作用域,一个是全局作用域.
  2. 在函数作用域中不能访问函数的父级变量.

例:

  1. /**
  2. * 1.php中,函数作用域只用两种,一种是函数作用域,一种是全局作用域.
  3. * 2.在函数中不能访问父级变量(外层变量), 见例1
  4. */
  5. // 例1:
  6. $name = '张三';
  7. function func (){
  8. echo "你好, {$name}";
  9. }
  10. func(); // 你好,

  • 要想访问外部变量,有两种方法:
    1. 1️⃣.在函数内使用global关键字
    2. 2️⃣.在函数内部使用超全局标量$GLOBALS:例2
    // 例1:
    1. $name1 = '张三';
    2. $name2 = '李四';
    3. function func1 (){
    4. global $name1;
    5. echo "你好, {$name1},{$GLOBALS['name2']}";
    6. }
    7. func1(); // 你好,

    2. 闭包:匿名函数(需要保存到变量中)

    想要声明一个闭包函数,只要在函数中添加一个use()就行.
    使用方式:$func = function (variable) use (外部变量){};

例子:

  1. $func2 = function (string $str) use ($name) : string {
  2. return $str . $name . '<br>';
  3. };
  4. echo $func2($name2);
  5. echo $func2('王二麻子');
  6. //

闭包函数多用于函数返回:

  1. // 闭包函数多用于函数返回
  2. function func4 (string $name) : object {
  3. return function ($password) use ($name){
  4. return sprintf("亲爱的玩家: %s, 欢迎回来!您的登录密码为: %s!<br>", $name,$password);
  5. };
  6. }
  7. // 调用1
  8. $fm= func4('admin');
  9. echo $fm('123456');
  10. // 调用2
  11. echo func4('main')('123456');

3. 回调的使用场景

php是单线程同步执行的,但是有些情况下如果一个函数出现了阻塞情况,会导致程序暂时性的停止,直到这个函数执行成功才会继续向下执行,这样会浪费大量的时间.
这个时候就需要把这个会发生阻塞的函数改为回调执行.

回调执行的方法:
/**

  1. * php是单线程同步执行的,但是有些情况下如果一个函数出现了阻塞情况,会导致程序暂时性的停止,直到这个函数执行成功才会继续向下执行,
  2. * 这样会浪费大量的时间.这个时候就需要把这个会发生阻塞的函数改为回调执行.回调执行的方法:
  3. * 1. call_user_func(函数, 函数参数); // 单参数的情况下时使用
  4. * 2. call_user_func_array(函数, [函数参数]); // 通用
  5. * 如果调用的是对象实例方法的话,需要把第一个参数修改一下:call_user_func_array([new 类名, 方法名], [函数参数]);
  6. * 如果调用的是静态对象实例方法的话,需要把第一个参数修改一下:call_user_func_array([类名, 静态方法名], [函数参数])
  7. * 或者call_user_func_array('类名::静态方法名', [函数参数])
  8. */

例:

  1. class callbackFunctionTest {
  2. public function test1($name, $age) {
  3. echo "姓名: {$name}, 性别: {$age}<br>";
  4. }
  5. public static function test2($name, $age) {
  6. call_user_func_array((new callbackFunctionTest())->test1, ['张三','18']); // 方法回调
  7. echo "姓名: {$name}, 性别: {$age}<br>";
  8. }
  9. }
  10. call_user_func_array([new callbackFunctionTest(), 'test1'], ['张三','18']);
  11. call_user_func_array(['callbackFunctionTest', 'test2'],['李四','19']);
  12. call_user_func_array('callbackFunctionTest::test2',['李四','19']);

4. 参数调用

4.1 必须参数

  1. /**
  2. * 必选参数
  3. */
  4. function demo1($name) {
  5. echo $name . '<br>';
  6. }
  7. demo1('必选参数');

4.2 可须参数

  1. /**
  2. * 可选参数
  3. * 在函数中,可以设置接收参数的默认值
  4. * 注意: 可选参数必须放在接收参数的为后面.原因: 函数中,参数的传递是按照顺序传递的,并不是相应的key对应value的形式.如果不放到最后,传参时
  5. * 就要预留一个或者多个空参,如这样:demo('admin','','18'); function(name, sex = '男', age){}.
  6. */
  7. function demo2($name = '张三123') {
  8. echo $name . '<br>';
  9. }
  10. demo2();
  11. demo2('李四');

4.3 不定参数

  1. //1,使用函数内部的函数获取参数
  2. function demo31() {
  3. // 获取传递了几个参数
  4. $num = func_num_args();
  5. echo "传递了{$num}个参数<br>";
  6. // 获取所有参数数组
  7. $arrs = '[' . implode(',', func_get_args()) . ']<br>'; //print_r(func_get_args());
  8. echo "所有的参数分别是: {$arrs}<br>";
  9. // 获取单个参数
  10. $arr1 = func_get_args()[0]; // 获取第一个参数
  11. $arr2 = func_get_arg(1); // 获取第二个参数
  12. echo "第一个参数是: {$arr1},第二个参数是: {$arr2}<br>";
  13. }
  14. demo31('1', '2', '3', '4', '5');
  15. //2,使用...rest语法,剩余参数
  16. function demo32(...$age) {
  17. print_r($age);
  18. echo '<br>';
  19. }
  20. demo32('1', '2', '3', '4', '5');

4.4 引用参数

php中参数传递费为两种一种是”值传递”(默认),一种是”引用传递”.想要是想引用传递很简单,只要在参数前面加一个&(取地址符)就好了.例子:

  1. $name = '张三';
  2. function demo(string &$name) : string {
  3. $name = '李四';
  4. return "你好, {$name}";
  5. }
  6. $name = '张三';
  7. function demo(string &$name) : string {
  8. $name = '李四';
  9. return "你好, {$name}";
  10. }
  11. echo "改变前: {$name}<br>";
  12. demo($name); // $name的值会改变.
  13. echo "改变后: {$name}<br>";

5. 多值返回类型方式

5.1 数组形式

  1. function returnManner() {
  2. $a = [];
  3. for ($i = 0; $i<10; $i++){
  4. $a[$i] = $i;
  5. }
  6. return $a;
  7. }
  8. print_r(returnManner());
  9. echo '<br>';

5.2 对象形式:匿名类

  1. function returnManner1(){
  2. return new class {
  3. public $name = 'admin';
  4. public $age = 18;
  5. function qwer(){
  6. echo "我是方法<br>";
  7. }
  8. };
  9. }

5.3 序列化返回: 多用于网络请求或者是本地化(保存到本地文件或者数据表(数据库))保存

  1. // php内部使用:序列化:serialize(),反序列化: unserialize()
  2. function returnManner2() {
  3. $a = [];
  4. for ($i = 0; $i<10; $i++){
  5. $a[$i] = (string)$i;
  6. }
  7. return serialize($a);
  8. }
  9. echo returnManner2() . "<br>";
  10. print_r(unserialize(returnManner2()));
  11. echo "<br>";
  12. // 通用: 序列化json_encode(),反序列化json_decode()
  13. function returnManner3() {
  14. $a = [];
  15. for ($i = 0; $i<10; $i++){
  16. $a[$i] = (string)$i;
  17. }
  18. return json_encode($a);
  19. }
  20. echo returnManner3() . "<br>";
  21. print_r(json_decode(returnManner3()));
  22. echo "<br>";
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议