博客列表 >PHP基础-函数定义/类型/返回值/参数

PHP基础-函数定义/类型/返回值/参数

岂几岂几
岂几岂几原创
2020年04月26日 13:22:201130浏览

函数

0. 说明

全局定义三个函数, 本博文的示例调用时说明略.

  1. function echobr($param = '')
  2. {
  3. echo $param . '<br>';
  4. }
  5. function dumpbr($param = '')
  6. {
  7. var_dump($param);
  8. echo '<br>';
  9. }
  10. function printfpre($param = '')
  11. {
  12. printf('<pre>%s</pre>', print_r($param, true));
  13. }

1. 函数定义

函数定义格式

  1. function 函数名[可选](参数列表[可选]) : 返回值类型[可选] {
  2. 函数体...
  3. return 返回值/变量/...[可选]
  4. }

函数定义demo:

  1. <?php
  2. /*
  3. 打招呼函数
  4. */
  5. function sayHello($name) : string {
  6. return $name . ', 你好!';
  7. }
  8. // 调用函数
  9. $str = sayHello();
  10. echobr($str);

2. 函数的类型

函数可分为以下四种类型

  1. 自定义函数

    • 程序员根据业务需要编写的函数
    • 上一点(函数定义)编写的sayHello()函数就是自定义函数
    • 示例

      1. <?php
      2. function info($name, $salary) : string {
      3. $info = $name . '本月的薪水是: ' . $salary . '元';
      4. echobr($info);
      5. }
      6. info('zhangsan', 8000);
  2. 系统函数

    • 由php运行环境提供给程序员使用的函数, 并不需要定义, 拿来即用, 开袋即食. 如: is_null(), empty(), gettype(), is_array()
  3. 可变函数

    • 将函数名赋值给一个变量, 可以通过该变量, 调用对应的函数.
    • 可变函数的”可变”, 个人理解, 是可以根据不同的条件, 给变量赋予不同的函数名称, 通过该变量调用不同的函数功能.
    • 示例

      1. <?php
      2. function add(int $num1, int $num2) : int {
      3. echobr($num1 + $num2);
      4. }
      5. function minus(int $num1, int $num2) : int {
      6. echobr($num1 - $num2);
      7. }
      8. $funcName = 'add';
      9. $funcName(5, 8);
      10. $funcName = 'minus';
      11. $funcName(20, 10);
  4. 匿名函数

    • 在PHP中, 匿名函数和闭包同义.
    • 匿名函数没有函数名称, 可以把匿名函数的函数定义作为值赋予给变量, 通过变量来调用匿名函数.
    • 匿名函数可以作为另一个函数的参数, 也可以被另一个函数当做返回值返回.
    • 示例1:

      1. <?php
      2. // 计算梯形的面积
      3. function calcArea($topLength, $bottomLength, $height, $add) {
      4. // 上底加下底
      5. $totalLength = $add($topLength, $bottomLength);
      6. // 乘以高除以二
      7. $s = $totalLength * $height / 2;
      8. return $s;
      9. }
      10. echobr(calcArea(3, 7, 5, function($a, $b){
      11. return $a + $b;
      12. }));
      13. /*
      14. 执行结果:
      15. 25
      16. */
    • 示例2:

      1. // 计算图形面积
      2. function calcArea1($figure)
      3. {
      4. if ($figure === '三角形') {
      5. return function ($bottom, $height) {
      6. // 底乘以高除以二
      7. return $bottom * $height / 2;
      8. };
      9. }
      10. if ($figure === '圆形') {
      11. return function ($r) {
      12. if (!defined('PI')) {
      13. define('PI', 3.14);
      14. }
      15. /* π乘以半径的平方 */
      16. return PI * $r ** 2;
      17. };
      18. }
      19. if ($figure === '矩形') {
      20. return function ($long, $height) {
      21. // 长乘以宽
      22. return $long * $height;
      23. };
      24. }
      25. return '暂无法计算此图形的面积';
      26. }
      27. $func = calcArea1('三角形');
      28. if(gettype($func) === 'object') {
      29. echobr($func(4, 8));
      30. } else {
      31. echobr($func);
      32. }
      33. /*
      34. 执行结果:
      35. 16
      36. */

2. 函数的返回值

函数的返回值为单值

  • return的是显式返回;示例略.
  • return的, 遇到}也会返回, 默认返回null.
    无显式返回值函数示例:
  1. // 没有return的函数
  2. function sayHello() {
  3. echobr('hello');
  4. }
  5. $data = sayHello();
  6. dumpbr($data);
  7. /*
  8. 运行结果:
  9. hello
  10. NULL
  11. */

若要返回多值, 返回值有以下四种处理方式

    1. 字符串拼接

      • 把多个返回值拼接起来, 用一个约定的标记分隔
      • 字符串拼接的使用场景

        1. 适合处理大量的php+html混写
        2. 这种返回的格式是用户自定义的, 前端处理非常麻烦
      • 示例

      1. <?php
      2. function userInfo() {
      3. $username = 'zhangsan';
      4. $sex = 'male';
      5. $age = '24';
      6. $salary = 8000;
      7. return $username . ',' . $sex . ',' . $age . ',' . $salary;
      8. }
      9. $userInfo = userInfo();
      10. $userArray = explode(',', $userInfo);
      11. dumpbr($userArray);
      12. /*
      13. 执行结果:
      14. array(4) { [0]=> string(8) "zhangsan" [1]=> string(4) "male" [2]=> string(2) "24" [3]=> string(4) "8000" }
      15. */
    1. 返回数组

      • 把多个值保存到数组中, 把数组返回.
      • 示例
  1. function productList() {
  2. $productList = [
  3. [
  4. 'id' => 1,
  5. 'cat_id' => 1,
  6. 'name' => '华为P40',
  7. 'brand' => '华为'
  8. ],
  9. [
  10. 'id' => 2,
  11. 'cat_id' => 1,
  12. 'name' => '华为Mate30',
  13. 'brand' => '华为'
  14. ],
  15. [
  16. 'id' => 1,
  17. 'cat_id' => 1,
  18. 'name' => 'Apple 11 Pro Max',
  19. 'brand' => 'Apple'
  20. ]
  21. ];
  22. return $productList;
  23. }
  24. printf('<pre>%s</pre>', print_r(productList(), true));
  25. /*
  26. 允许结果:
  27. Array
  28. (
  29. [0] => Array
  30. (
  31. [id] => 1
  32. [cat_id] => 1
  33. [name] => 华为P40
  34. [brand] => 华为
  35. )
  36. [1] => Array
  37. (
  38. [id] => 2
  39. [cat_id] => 1
  40. [name] => 华为Mate30
  41. [brand] => 华为
  42. )
  43. [2] => Array
  44. (
  45. [id] => 1
  46. [cat_id] => 1
  47. [name] => Apple 11 Pro Max
  48. [brand] => Apple
  49. )
  50. )
  51. */
    1. 通过json数据返回
  1. function productList() {
  2. $productList = [
  3. [
  4. 'id' => 1,
  5. 'cat_id' => 1,
  6. 'name' => '华为P40',
  7. 'brand' => '华为'
  8. ],
  9. [
  10. 'id' => 2,
  11. 'cat_id' => 1,
  12. 'name' => '华为Mate30',
  13. 'brand' => '华为'
  14. ],
  15. [
  16. 'id' => 1,
  17. 'cat_id' => 1,
  18. 'name' => 'Apple 11 Pro Max',
  19. 'brand' => 'Apple'
  20. ]
  21. ];
  22. return json_encode($productList);
  23. }
  24. printf('<pre>%s</pre>', productList());
  25. /*
  26. 运行结果
  27. [{"id":1,"cat_id":1,"name":"\u534e\u4e3aP40","brand":"\u534e\u4e3a"},{"id":2,"cat_id":1,"name":"\u534e\u4e3aMate30","brand":"\u534e\u4e3a"},{"id":1,"cat_id":1,"name":"Apple 11 Pro Max","brand":"Apple"}]
  28. */
    1. 通过序列化数据返回

和json数据类似,序列化的结果,也是有一定规则的字符串。

  1. function productList() {
  2. $productList = [
  3. [
  4. 'id' => 1,
  5. 'cat_id' => 1,
  6. 'name' => '华为P40',
  7. 'brand' => '华为'
  8. ],
  9. [
  10. 'id' => 2,
  11. 'cat_id' => 1,
  12. 'name' => '华为Mate30',
  13. 'brand' => '华为'
  14. ],
  15. [
  16. 'id' => 1,
  17. 'cat_id' => 1,
  18. 'name' => 'Apple 11 Pro Max',
  19. 'brand' => 'Apple'
  20. ]
  21. ];
  22. return serialize($productList);
  23. }
  24. printf('<pre>%s</pre>', productList());
  25. /*
  26. 运行结果:
  27. a:3:{i:0;a:4:{s:2:"id";i:1;s:6:"cat_id";i:1;s:4:"name";s:9:"华为P40";s:5:"brand";s:6:"华为";}i:1;a:4:{s:2:"id";i:2;s:6:"cat_id";i:1;s:4:"name";s:12:"华为Mate30";s:5:"brand";s:6:"华为";}i:2;a:4:{s:2:"id";i:1;s:6:"cat_id";i:1;s:4:"name";s:16:"Apple 11 Pro Max";s:5:"brand";s:5:"Apple";}}
  28. */

3. 函数的参数

    1. 值参数

      • 值参数只传递参数值, 原变量的值保持不变, 不受函数处理的影响

      • 示例:

  1. $name = 'zhangsan';
  2. function sayHello($username) {
  3. $username .= ', 你好';
  4. echobr($username);
  5. }
  6. sayHello($name);
  7. /* 全局变量$name的值还是'zhangsan' */
  8. echobr($name);
  9. /*
  10. 运行结果:
  11. zhangsan, 你好
  12. zhangsan
  13. */
    1. 引用参数

      • 引用参数相当于传入变量的一个别名, 函数实际处理的还是原变量指向的值. 即原变量的值会因函数的处理而改变.
      • 示例:
  1. $num = 0;
  2. // 原值+5;
  3. function addFive(&$num) {
  4. $num += 5;
  5. }
  6. addFive($num);
  7. echobr($num);
  8. /*
  9. 运行结果:
  10. 5
  11. */
    1. 默认参数

      • 1.和2.都属于必选参数, 默认参数是可选参数, 可选参数必须放在必选参数后面

      • 就是给形参加默认值,调用函数时,若不给该参数传入实参,则该形参就初始化为默认值。

  1. // 循环生成key=value的数组
  2. function createArrayVal($start, $length, $arr = []) {
  3. for($index = 0; $index < $length; $index++) {
  4. $sum = $start + $index;
  5. $arr[$sum] = $sum;
  6. }
  7. return $arr;
  8. }
  9. // 先生成5个数组元素
  10. $arr = createArrayVal(0, 5);
  11. printfpre($arr);
  12. // 再生成3个数组元素
  13. printfpre(5, 3, $arr);
  14. /*
  15. 运行结果:
  16. Array
  17. (
  18. [0] => 0
  19. [1] => 1
  20. [2] => 2
  21. [3] => 3
  22. [4] => 4
  23. )
  24. Array
  25. (
  26. [0] => 0
  27. [1] => 1
  28. [2] => 2
  29. [3] => 3
  30. [4] => 4
  31. [5] => 5
  32. [6] => 6
  33. [7] => 7
  34. )
  35. */
    1. 剩余参数

个人理解就是,如果一个函数设置了剩余参数,那么传入的参数数量比函数的参数多时,多出的那部分参数当作数组的元素传入到剩余参数中。

  1. function register($first, $second, $third, $fourth, ...$more) {
  2. echobr('第一个挂号的是:' . $first);
  3. echobr('第二个挂号的是:' . $second);
  4. echobr('第三个挂号的是:' . $third);
  5. echobr('第四个挂号的是:' . $fourth);
  6. eochobr('今天加号有' . count($more) . '名病人。它们分别是:');
  7. foreach($more as $key => $item) {
  8. echobr("第{$key + 1}个加号的是:{$item}");
  9. }
  10. }
  11. register('zhangsan', 'lisi', 'wangwu', 'zhaoliu', 'Lucy', 'Lily', 'lilei');
  12. /*
  13. 运行结果:
  14. 第一个挂号的是:zhangsan
  15. 第二个挂号的是:lisi
  16. 第三个挂号的是:wangwu
  17. 第四个挂号的是:zhaoliu
  18. 今天加号有3名病人。它们分别是:
  19. 第1个加号的是:Lucy
  20. 第2个加号的是:Lily
  21. 第3个加号的是:lilei
  22. */

剩余参数(数组),也可以作为实参传入函数中,这样数组中的元素值,就会按顺序赋值给函数的参数

  1. function register($username, $password, $repassword, $age) {
  2. echobr("注册成功,注册信息为:");
  3. echobr("用户名:{$username}");
  4. echobr("密码:{$password}");
  5. echobr("年龄:{$age}");
  6. }
  7. $user = ['admin', '123456', 25];
  8. register(...$user);
  9. /*
  10. 执行结果:
  11. 注册成功,注册信息为:
  12. 用户名:admin
  13. 密码:123456
  14. 年龄:25
  15. */

学习心得

  • 个人认为,函数是构成一个可重复调用的功能的最小单位。复杂的功能则需要多个函数协同工作完成。
  • 函数的学习围绕组成函数的部分展开。
    • 函数的类型,根据函数的提供方划分,可以划分为自定义函数(程序员自己写的函数)和系统函数(PHP运行环境提供的,开袋即食的函数);根据是否拥有函数名划分,可分为命名函数和匿名函数。某个变量,可以指向不同的匿名函数,这样的变量就变成了可变函数。
    • 函数的返回值,函数的返回值都是单值返回。如果要返回多个值,都是想办法把多个值变成可以解析的某种单值数据结构返回。最简单的办法,是使用某个约定好的字符串分隔符把多个值连接。也可以使用数组/对象等复合数据结构的数据返回。在web前后端交互中,一般采用json格式或序列化的数据格式返回。这两种方式,本质上也是返回使用特定的字符串连接多个数据值形成的字符串,但是这两种方法是公认的经过规范化使用的。
    • 函数的参数,函数的参数就是传递给函数处理的“原材料”。根据传递方式的不同,可以分为值参数和引用参数,值参数不会改变原变量的值,而引用参数则会改变原变量的值。当参数的某个值在实际使用中频繁出现时,可以把这个值设置为该参数的默认值,该参数就变成了默认参数,在函数调用时就可以省略对默认参数的传值,函数会使用默认参数的默认值参与函数逻辑运算。当函数参数是数量不定的多个相同意义的变量值时,可以考虑使用剩余函数来设置函数参数,个人感觉这不是必须的,因为剩余函数也可以用默认值是空数组的默认参数来实现,区别在于剩余函数会自动把多出来的变量转成数组,而默认参数则需要手动创建参数数组才能传参。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议