PHP 函数

编辑: admin 分类: 电脑知识 发布时间: 2023-06-14 来源:互联网
4.5.1 预定义函数
  • get_defined_functions() 查看已定义的函数,包括系统预定义函数和用户自定义函数

    1. printf('<pre>%s</pre>', print_r(get_defined_functions(), true));
    2. // 输出所有系统预定义函数和用户自定义函数
    3. Array
    4. (
    5. [internal] => Array
    6. (
    7. [0] => zend_version
    8. [1] => func_num_args
    9. [2] => func_get_arg
    10. ...
    11. [1393] => memcache_flush
    12. [1394] => memcache_set_sasl_auth_data
    13. )
    14. [user] => Array
    15. (
    16. )
    17. )
  • function_exists() 判断函数是否已定义

    1. $result = function_exists('ctype_graph');
    2. var_dump($result); // bool(true)
4.5.2 命名函数4.5.2.1 格式
  • 格式:function 函数名(参数) { 函数体 }

  • function:定义函数关键词

  • 定义时的参数为形参
  • 函数体必须要有返回值 return,返回值可以是单个值、表达式、数组、对象、json字符串…
  1. // 定义命名函数
  2. function sum($a, $b)
  3. {
  4. return $a + $b;
  5. }
4.5.2.2 调用
  • 调用:函数名(参数)

  • 调用时的参数为实参

    1. var_dump(sum(1,3)); // string(1) "4"
  • 强制规定参数类型和返回值类型

    1. // 不指定参数类型和返回值类型
    2. function sum($a, $b)
    3. {
    4. return $a + $b;
    5. }
    6. var_dump(sum(1,3)); // string(1) "4",数值默认返回字符串
    7. // 强制指定参数类型
    8. function sum(int $a, int $b)
    9. {
    10. return $a + $b;
    11. }
    12. var_dump(sum(1,3)); // int(4),返回类型根据实参类型和执行结构确定
    13. // 强制规定参数类型和返回值类型
    14. function sum(int $a, int $b): string
    15. {
    16. return $a + $b;
    17. }
    18. var_dump(sum(1,3)); // string(1) "4",返回指定的类型
  • 命名函数是全局作用域,可以在函数定义前调用

    1. echo sum(1, 3); // 4
    2. function sum(int $a, int $b): string
    3. {
    4. return $a + $b;
    5. }
  • 回调,可以把一个命名函数当做参数传给另一个函数

    • call_user_func (函数名, 参数)

      第一个参数:函数名,被回调的命名函数的名称,需用单引号括起来

      第二个参数:参数,被回调的命名函数所需的参数

      1. // 被回调的匿名函数只有一个参数
      2. function boo($a) {
      3. return $a *= 10;
      4. };
      5. echo call_user_func('boo', 8); // 80
      6. // 被回调的匿名函数有多个参数
      7. function foo($a, $b, $c) {
      8. return array_sum([$a,$b,$c]);
      9. };
      10. echo call_user_func('foo', ...[1,2,3]); // 6
    • call_user_func_array(函数名, 参数数组)

      第一个参数:函数名,被回调的命名函数的名称,需用单引号括起来

      第二个参数:参数数组,被回调的命名函数所需的参数所组成的数组

      1. function foo($a, $b, $c) {
      2. return array_sum([$a,$b,$c]);
      3. };
      4. echo call_user_func_array('foo', [1,2,3]); // 6
4.5.2.3 参数
  • 一般实参数量要与形参数量一致,从左往右与形参对应

  • 默认参数,定义函数时给参数指定默认值,调用时可以不给对应的参数,取默认值

    1. function sum1(int $a, int $b, int $c = 10): int
    2. {
    3. return array_sum([$a, $b, $c]);
    4. }
    5. echo sum1(20, 30); // 60
  • 命名参数(注:php8.0 开始支持)

    1. function sum2(int $a, int $b, int $c = 10, int $d = 20): int
    2. {
    3. return array_sum([$a, $b, $c, $d]);
    4. }
    5. // 第三个参数不给取默认值,第四个参数用命名参数
    6. echo sum2(1, 2, d: 3); // 16
  • 可变参数,参数太多 或者不确定参数的个数 在参数前加 ... 标识为可变参数

    1. function foo($arg, ...$args) //聚拢 收集
    2. {
    3. var_dump($arg, $args);
    4. }
    5. echo foo(1, 2, 3, 4, 5);
    6. // 输出:int(1) array(4) { [0]=> int(2) [1]=> int(3) [2]=> int(4) [3]=> int(5) }
    7. function boo(...$args)
    8. {
    9. return array_sum($args);
    10. }
    11. echo boo(1, 2, 3, 4, 5); // 15
  • 引用参数,定义函数时,形参前面加 & ,将值传递变为引用传递

    • 值传递,复制一份内存地址,函数执行结果不影响被引用的变量

    • 引用传递,两个变量指向同一个内存地址,函数执行结果会改变被引用的变量

      1. // 值传值
      2. function hoo($arg)
      3. {
      4. return $arg += 10;
      5. }
      6. $a = 10;
      7. echo hoo($a); // 20
      8. echo $a; // 10,函数执行结果不影响被引用的变量
      9. // 引用传递
      10. function hoo(&$arg)
      11. {
      12. return $arg += 10;
      13. }
      14. $a = 10;
      15. echo hoo($a); // 20
      16. echo $a; // 20,函数执行结果会改变被引用的变量
    • 引用传值同样适用与变量

      1. $x = 100;
      2. $y = $x; //值传递
      3. $x = 200;
      4. echo $y; // 100
      5. $y = &$x; //引用赋值 $x $y 指向同一个内存地址 互相受影响
      6. $x = 1000;
      7. echo $y; // 1000
      8. $y = 8888;
      9. echo $x; // 8888
4.5.2.4 返回值
  • 函数只允许一条返回语句,return 后面的代码不会被执行

    1. function fn1()
    2. {
    3. return 1 == '1';
    4. return '你好'; // 不会被执行
    5. }
    6. var_dump(fn1()); // bool(true)
  • 返回值可以是单个值、表达式、数组、对象、json字符串…

    1. // 返回 json 字符串
    2. function fn1()
    3. {
    4. return json_encode(['code' => 0, 'msg' => '登录成功']);
    5. }
    6. var_dump(fn1()); // string(43) "{"code":0,"msg":"\u767b\u5f55\u6210\u529f"}"
4.5.2.5 扩展:json_encode()
  • json_encode() 默认会将中文字符转为 unicode 编码,可以给json_encode() 添加第二个参数:JSON_UNESCAPED_UNICODE 不转义

    1. function fn1()
    2. {
    3. return json_encode(['code' => 0, 'msg' => '登录成功'], JSON_UNESCAPED_UNICODE);
    4. }
    5. var_dump(fn1()); // string(31) "{"code":0,"msg":"登录成功"}"
  • JSON_UNESCAPED_UNICODE 为系统预定义常量,值等于 256,所以第二个参数可以直接写 256

    1. function fn1()
    2. {
    3. return json_encode(['code' => 0, 'msg' => '登录成功'], 256);
    4. }
    5. var_dump(fn1()); // string(31) "{"code":0,"msg":"登录成功"}"
  • JSON_UNESCAPED_SLASHES,不转义斜杠 / ,值为 64,应用:url 地址

    1. // 默认转义,url 地址不正确
    2. function fn1()
    3. {
    4. return json_encode(['code' => 0, 'rul' => 'https://www.baidu.com']);
    5. }
    6. var_dump(fn1()); // string(42) "{"code":0,"rul":"https:\/\/www.baidu.com"}"
    7. // 添加第二个参数 JSON_UNESCAPED_SLASHES,不转义,url 地址正确
    8. function fn1()
    9. {
    10. return json_encode(['code' => 0, 'rul' => 'https://www.baidu.com'], 64);
    11. }
    12. var_dump(fn1()); // string(40) "{"code":0,"rul":"https://www.baidu.com"}"
  • 同时不转义 unicode 和 斜杠,第二个参数可以设置为 320(256 + 64)

    1. function fn1()
    2. {
    3. return json_encode(['code' => 0, 'msg' => '登录成功/'], 320);
    4. }
    5. var_dump(fn1()); string(32) "{"code":0,"msg":"登录成功/"}"
4.5.3 匿名函数4.5.3.1 格式
  • 不指定函数名称,将整个函数赋值给一个变量

  • 格式:变量 = function (参数) { 函数体 }

    1. $boo = function ($a) {
    2. return $a *= 10;
    3. };
4.5.3.2 调用
  • 传统调用:变量名(参数)

    1. $boo = function ($a) {
    2. return $a *= 10;
    3. };
    4. echo $boo(2); // 20
  • 匿名函数不是全局作用域,定义前不能调用

    1. echo $boo(2); // Undefined variable: boo
    2. $boo = function ($a) {
    3. return $a *= 10;
    4. };
  • 回调,可以把一个匿名函数当做参数传给另一个函数

    • call_user_func (函数名, 参数)

      第一个参数:函数名,被回调的匿名函数的变量名

      第二个参数:参数,被回调的匿名函数所需的参数

      1. // 被回调的匿名函数只有一个参数
      2. $boo = function ($a) {
      3. return $a *= 2;
      4. };
      5. echo call_user_func($boo, 2);
      6. // 被回调的匿名函数有多个参数
      7. $boo = function ($a, $b, $c) {
      8. return array_sum([$a,$b,$c]);
      9. };
      10. echo call_user_func($boo, ...[1,2,3]); // 6
    • call_user_func_array(函数名, 参数数组)

      第一个参数:函数名,被回调的匿名函数的变量名

      第二个参数:参数数组,被回调的匿名函数所需的参数所组成的数组

      1. $boo = function ($a, $b, $c) {
      2. return array_sum([$a,$b,$c]);
      3. };
      4. echo call_user_func_array($boo, [1,2,3]); // 6
4.5.3.2 参数及返回值同命名函数4.5.4 回调函数

php 是单线程,同步执行(从前往后逐条执行),如果遇到耗时的函数会发生阻塞,应该将它改为异步回调来去执行。

回调:在主线程执行的过程中,跳到预先设置好的函数中去执行(异步,支线程),主线程继续执行,异步执行有结果后返回主线程。

4.5.5 递归函数

递归函数(recursion):是指直接或间接地调用函数自身的函数。

必须有一个终止处理或计算的准则。

  1. function demo($a = 1)
  2. {
  3. if ($a <= 5) {
  4. echo "第{$a}次执行" . PHP_EOL;
  5. $a++;
  6. demo($a); // 调用自己
  7. }
  8. }
  9. demo(); // 第1次执行 第2次执行 第3次执行 第4次执行 第5次执行
4.5.6 函数引用全局变量
  • 全局变量不能在函数体内直接调用

    1. $b = 10;
    2. $boo = function ($a) {
    3. return $a *= $b;
    4. };
    5. echo $boo(2);
    6. // Undefined variable: b
  • 使用 use 关键字引入全局变量

    1. $b = 10;
    2. $boo = function ($a) use ($b) {
    3. return $a *= $b;
    4. };
    5. echo $boo(2); // 20
【感谢本站数字底座由龙石数据提供 http://www.longshidata.com/pages/government.html】