Blogger Information
Blog 41
fans 0
comment 0
visits 31028
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP函数作用域、闭包及函数多值返回
陈强
Original
1039 people have browsed it

函数声明与调用

  • 函数声明使用关键字function 函数名称(类型限定 参数列表) : 返回值类型
  1. //function 后边函数名称(类型限定 参数列表) : 返回值类型
  2. function user(string $name) : string
  • 函数返回值用return ,没有return返回值为null
  1. //参数可以多个,用','隔开
  2. function user(string $name, int $age): string
  3. {
  4. return $name . $age;
  5. }
  6. echo user('jack', 30);//输出jack 30

函数的分类

  • 命名函数:命名函数在全局都可调用
  1. //user 为函数名
  2. function user(string $name, int $age): string
  3. //用函数名调用
  4. echo user('jack',30);
  • 匿名函数 :需要把函数赋值给一个变量使用
  1. //把函数赋值给变量$user
  2. $user = function (): string
  3. {
  4. return 'jerry';
  5. }
  6. //用变量调用
  7. echo $user();

函数的参数

  • 必选参数
  1. function user(string $name): string
  2. {
  3. return $name ;
  4. }
  5. //调用的时候参数必须输入
  6. echo user('jack');
  • 可选参数
  1. function user(string $name,int $age = 18): string
  2. {
  3. return $name .$age;
  4. }
  5. //$age设定了默认值,调用的时候可以不输入,如果输入则替换默认值
  6. echo user('jack');
  • 不定参数
  1. //在不去定参数的情况下可以用...rest语法,把参数压到数组中
  2. function user(string ...$arr): string
  3. {
  4. //数组求和
  5. return array_sum($arr);
  6. }
  7. echo user(1, 2, 3, 4, 5);
  • 引用参数:引用参数(&)会修改原始参数的值
  1. $age = 30;
  2. function man(int &$age): string
  3. {
  4. $age = 100;
  5. return $age;
  6. };
  7. echo man($age), '<br>';
  8. //因为$age被引用,函数内的$age值改变了全局的$age,输出$age = 100
  9. echo $age;

作用域与闭包

  • 作用域 在函数中调用外部的变量
  1. $name = 'jack';
  2. $age = 30;
  3. function user(): string
  4. {
  5. //函数内部声明的变量外部不可见
  6. $gender = '男';
  7. //用关键字global来调用外部的变量
  8. global $name;
  9. //也可以用$GLOBALS直接调用
  10. return $name . $GLOBALS['age'];
  11. }
  12. echo user();
  • 闭包 匿名函数
  1. $name = 'jack';
  2. $age = 30;
  3. //匿名函数需使用use 来引入参数
  4. $user = function () use ($name, $age): string {
  5. return $name . $age;
  6. };
  7. echo $user();
  • 匿名可以使用引入传参
  1. //用'&'引入传参
  2. $user = function ($myname) use (&$name): string {
  3. return $name = $myname;
  4. };
  5. //改变$myname的值为jerry
  6. echo $user('jerry');
  7. //$name的值也更新为jerry
  8. echo $name;
  • 闭包的最佳使用场景 : 返回一个函数
  1. function user($name)
  2. {
  3. return function ($color) use ($name): string {
  4. return sprintf('<h3 style="color:%s">%s</h3>', $color, $name);
  5. };
  6. }
  7. $closure = user('jerry');
  8. echo $closure('red');
  • use禁止使用以下三种参数

    • 超全局不让用,如 $_GET

    • $this

      1. 与当前参数重名不让用

回调函数

  • call_user_func_array(函数,[参数数组])
  1. function user(string $name): string
  2. {
  3. return printf('我叫 %s', $name);
  4. }
  5. //采用回调异步执行
  6. call_user_func_array('user', ['jack']);

函数多值返回

  • 数组
  1. function user(): array
  2. {
  3. return ['name' => 'jack', 'age' => '30'];
  4. }
  5. var_dump(user());
  • 对象
  1. function man(): object
  2. {
  3. //创建一个匿名类返回
  4. return new class()
  5. {
  6. public $name = 'jack';
  7. public $age = 30;
  8. };
  9. }
  10. //把函数赋给一个变量
  11. $user = man();
  12. //使用变量调用
  13. var_dump($user);
  14. //调用对象中的一个元素
  15. echo $user->name;
  • php内置的序列化函数
  1. function user(): string
  2. {
  3. return serialize(['name' => 'jack', 'age' => '30']);
  4. }
  5. //将函数的返回值赋给变量$user
  6. $user = user();
  7. //输出$user
  8. echo $user; //{"name":"jack","age":"30"}
  9. //用json_decode把返回值赋给变量$res
  10. $res = unserialize(user());
  11. //输出
  12. var_dump($res);
  13. //array(2) { ["name"]=> string(4) "jack" ["age"]=> string(2) "30" }
  • 通用的json格式的字符串
  1. function user(): string
  2. {
  3. return json_encode(['name' => 'jack', 'age' => '30'], JSON_UNESCAPED_UNICODE);
  4. }
  5. //将函数的返回值赋给变量$user
  6. $user = user();
  7. //输出$user
  8. echo $user; //{"name":"jack","age":"30"}
  9. //用json_decode把返回值赋给变量$res
  10. $res = json_decode(user());
  11. //调用对象中的元素
  12. echo $res->name, $res->age;
  13. //默认是对象方式返回,如果使用数组方式返回json_decode()传入第二个参数 : true
  14. $res = json_decode(user(),true);
  15. var_dump($res);
  16. //输出:array(2) { ["name"]=> string(4) "jack" ["age"]=> string(2) "30" }

静态变量

  1. // 静态变量
  2. function demo1()
  3. {
  4. // 函数中的静态变量不会随函数调用结束而消失
  5. // 他会自动进入到下一次的函数调用中
  6. // 可以实现在函数的多次调用过程中:共享数据 / 数据通信
  7. static $i = 1;
  8. echo $i,'<br>';
  9. $i++;
  10. }
  11. // echo $i;
  12. echo demo1();
  13. echo demo1();
  14. echo demo1();
  15. echo demo1();
  16. echo demo1();

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:学过js,这些都是小儿科了
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