Blogger Information
Blog 57
fans 3
comment 0
visits 59778
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP基础-函数定义/类型/返回值/参数
岂几岂几
Original
1120 people have browsed it

函数

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格式或序列化的数据格式返回。这两种方式,本质上也是返回使用特定的字符串连接多个数据值形成的字符串,但是这两种方法是公认的经过规范化使用的。
    • 函数的参数,函数的参数就是传递给函数处理的“原材料”。根据传递方式的不同,可以分为值参数和引用参数,值参数不会改变原变量的值,而引用参数则会改变原变量的值。当参数的某个值在实际使用中频繁出现时,可以把这个值设置为该参数的默认值,该参数就变成了默认参数,在函数调用时就可以省略对默认参数的传值,函数会使用默认参数的默认值参与函数逻辑运算。当函数参数是数量不定的多个相同意义的变量值时,可以考虑使用剩余函数来设置函数参数,个人感觉这不是必须的,因为剩余函数也可以用默认值是空数组的默认参数来实现,区别在于剩余函数会自动把多出来的变量转成数组,而默认参数则需要手动创建参数数组才能传参。
Correcting teacher:天蓬老师天蓬老师

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
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!