博客列表 >php.cn_week5_day2作业提交【函数】

php.cn_week5_day2作业提交【函数】

Allen在php中文网的学习笔记
Allen在php中文网的学习笔记原创
2020年08月19日 01:19:13619浏览

作业内容

  1. 实例演示函数的类型
  2. 实例演示函数的返回值方式
  3. 实例演示函数的参数
  4. 实例演示函数的回调执行方式
  5. 实例演示函数的全名空间
  6. 实例演示字符串的四种创建方式与应用场景

函数的类型

自定义函数

  1. function addNum($num1,$num2)
  2. {
  3. retrun $num1 + $num2;
  4. }
  5. echo addNum(1,2);

系统函数/内置函数

由系统事先声明好,用户只须调用即可

可变函数

将函数的名称放在一个变量中进行引用

  1. //与演示中的自定义函数相关联
  2. $funcName = 'addNum';
  3. echo '和值:',$funcName(9000, 0.6);

匿名函数

//命名函数: 有名称
// 匿名函数: 没有名称

  1. $getPrice = function (float $money, float $discount) : float {
  2. return $money * $discount;
  3. };

闭包

  1. // 匿名函数在php中也称之为闭包,闭包也是一个函数,可以访问上一级空间的成员
  2. // 将折扣率变量声明到它的全局空间,是它的父作用域
  3. $discount = 0.8;
  4. $p = function (float $money) use ($discount) : float {
  5. return $money * $discount;
  6. };
  7. echo '实付金额: ' , $p(10000), ' 元<hr>';
  8. // 闭包更多是指子函数
  9. $f = function ($discount) {
  10. // $discount = 0.8;
  11. return function (float $money, int $n) use ($discount) : float {
  12. $total = $money * $n;
  13. return ($total > 20000) ? ($total * $discount) : $total;
  14. };
  15. };
  16. // $p 是闭包函数的引用
  17. // $p = $f(0.5);
  18. echo '实付金额: ' , $p(10000, 5) , ' 元<hr>';
  19. echo '实付金额: ' , $f(0.6)(10000, 5) , ' 元<hr>';
  20. // 闭包是匿名函数最常用的应用场景之一
  21. // 闭包是一个子函数,全局不可见,但是它的父函数可见
  22. // 闭包全局无法调用,可以当成父函数的返回值返回到全局,它可以将函数中的一些内容带给全局使用
  23. // 因为函数一旦调用完成,内部全部释放掉, 外部不再能访问,外部不能访问函数中的私有成员
  24. // 那么函数中的私有成员 , 可以通过它的子函数(闭包)返回到全局供它使用

函数的返回值方式

  1. 函数必有返回值
  2. 函数只支持单值返回

通过字符串拼接返回多值

  1. function demo1(): string
  2. {
  3. $status = 1;
  4. $message = '成功';
  5. return $status . $message ;
  6. }
  7. echo demo1();

通过数组返回多值

  1. function demo2(): array
  2. {
  3. $status = 1;
  4. $message = '成功';
  5. return ['status'=>$status, 'message'=>$message] ;
  6. }

通过json格式化字符串返回多值

  1. function demo3(): string
  2. {
  3. $status = 1;
  4. $message = '成功';
  5. // 将数组进行json编码,返回json格式的字符串
  6. return json_encode(['status'=>$status, 'message'=>$message]);
  7. }

将返回值序列化成字符串返回多值

  1. function demo4(): string
  2. {
  3. $status = 1;
  4. $message = '成功';
  5. // 将返回值序列化成字符串返回多个值
  6. return serialize(['status'=>$status, 'message'=>$message]);
  7. }
  8. $str = demo4();
  9. echo $str;
  10. $arr = unserialize($str);
  11. print_r($arr);

函数的参数

1.值参数

  1. // 1. 值参数: 值传递参数,这是默认的方式
  2. function demo1(float $arg) : float
  3. {
  4. // 在函数中对参数的改变并不会映射到外部的参数
  5. // return $arg = $arg * 2;
  6. return $arg *= 2;
  7. }
  8. $var = 100;
  9. echo demo1($var), '<br>';
  10. echo $var, '<hr>';

2.引用参数

  1. // 2. 引用参数, 在参数前添加取地址符: &
  2. function demo2(float &$arg) : float
  3. {
  4. // 在函数中对参数的改变映射到外部的参数
  5. return $arg *= 2;
  6. }
  7. $var = 100;
  8. echo demo2($var), '<br>';
  9. echo $var, '<hr>';

3.默认参数

  1. // 3. 默认参数
  2. function demo3(float $a, float $b, string $opt = '+') : string
  3. {
  4. switch ($opt) {
  5. case '+':
  6. return sprintf('%d + %d = %d', $a, $b, ($a + $b));
  7. break;
  8. case '-':
  9. return sprintf('%d - %d = %d', $a, $b, ($a - $b));
  10. break;
  11. case '*':
  12. return sprintf('%d * %d = %d', $a, $b, ($a * $b));
  13. break;
  14. case '/':
  15. if ($b !== 0)
  16. return sprintf('%d / %d = %f', $a, $b, ($a / $b));
  17. else die('除数不能为零');
  18. break;
  19. default:
  20. die('非法操作符');
  21. }
  22. }
  23. echo demo3(10, 20, '+'), '<br>';
  24. echo demo3(10, 20), '<br>';
  25. echo demo3(10, 20, '*'), '<br>';
  26. echo demo3(10, 20, '/'), '<br>';

4.剩余参数

  1. // ...rest, ...spread 语法
  2. function demo4($a, $b, $c)
  3. {
  4. return $a + $b + $c;
  5. }
  6. // 这个函数只能计算二个数的和
  7. echo demo4(39, 22, 20), '<br>';
  8. function demo5()
  9. {
  10. // print_r(func_get_args());
  11. return array_sum(func_get_args());
  12. }
  13. echo demo5(12,34,55,3,8,12,90), '<br>';
  14. // ...rest 剩余参数
  15. // ...args: 将传给参数的所有参数全部压到一个数组中,args
  16. function demo6(...$args)
  17. {
  18. // print_r($args);
  19. return array_sum($args);
  20. }
  21. echo demo6(12,34,55,3,8,12,90), '<br>';
  22. // ...rest / ...spread 混合在一起用
  23. function demo7(...$args)
  24. {
  25. // print_r($args);
  26. return array_sum($args);
  27. }
  28. $data = [12,34,55,3,8,12,90];
  29. // ...spread用在调用时的参数中,用在有具体值的参数列表,实参
  30. echo demo7(...$data), '<br>';
  31. echo demo7(...[2,3,6,7,1,9]);
  32. // ...name: 当用在调用参数中, 是展开功能,当用在声明参数中, 是归内功能

函数的回调执行方式

  1. // 直接调用(同步调用:这条调用语句不执行完成, 后面语句不会被执行)
  2. echo demo1(1,2,3), '<br>';
  3. // 以回调的方式来执行一个函数
  4. echo call_user_func('demo1', 1,2,3);
  5. echo '<hr>';
  6. echo call_user_func_array('demo1', [1,2,3]);
  7. // 例如,demo1()函数执行时间非常的耗时,此时用提回调方式执行,那么后面的"echo 'hello word';:"不必等待demo1()执行完成
  8. // echo 'hello word';
  9. echo '<hr>';
  10. // 回调函数是异步执行的重要工具

call_user_func_array

(PHP 4 >= 4.0.4, PHP 5, PHP 7)

call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数

说明

call_user_func_array ( callable $callback , array $param_arr ) : mixed
把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入。

参数

callback
被调用的回调函数。

param_arr
要被传入回调函数的数组,这个数组得是索引数组。

返回值

返回回调函数的结果。如果出错的话就返回FALSE

函数的命名空间

  1. namespcae
  1. <?php
  2. // 函数的命名空间
  3. // __FUNCTION__: 返回当前的函数名称字符串
  4. namespace ns1;
  5. function demo1()
  6. {
  7. return __FUNCTION__;
  8. }
  9. echo demo1();
  10. echo '<hr>';
  11. // 在php中不允许在同一个命名空间中声明声明同名函数的, js可以
  12. namespace ns2;
  13. function demo1()
  14. {
  15. return __FUNCTION__;
  16. }
  17. echo demo1();
  18. echo '<br>';
  19. // 也可调用另一个空间的函数
  20. echo \ns1\demo1();

字符串的四中创建方式与应用场景

字符串长度上限:  2G
创建方式

1. 单引号

  1. $str = 'string';
  2. // 单引号中的变量不能被解析出来
  3. echo 'This is a $str hello word. <br>';
  4. // 通过字符串与变量接来来解析变量,将变量与字符串组合后输出
  5. echo 'This is a '.$str.' hello word. <br>';
  6. // 单引号的特殊字符不能被解析,原样输出
  7. echo 'hello \n\r word. <br>';
  8. // 单引号其实有二重意义: 1. 本义就是字符, 2. 字符串的定界符
  9. // 单引号中又出现单引号,必须使用转义符: \
  10. echo 'This is a \'test\'. <br>';
  11. // 如果又出现了转义符: \, 应该连写2个才可以正常输出,否则就是转义
  12. echo 'This is a \'test\\\'. <br>';
  13. echo '<hr>';

2. 双引号

  1. // 双引号中的变量能被解析出来
  2. echo "This is a $str hello word. <br>";
  3. // echo "This is a $str123 hello word. <br>";
  4. // echo "This is a $str 123 hello word. <br>";
  5. echo "This is a {$str}123 hello word. <br>";
  6. // ${var}: 与es6中的模板字符串语法相同
  7. echo "This is a ${str}123 hello word. <br>";
  8. // 双引号的特殊字符能被解析,多个空格或回车在页面视为1个
  9. echo "hello \n\r word. <br>";
  10. echo "This is a \"demo\". <hr>";

3. heredoc, 可以当作双引号的plus+

  1. $hello = 'php.cn';
  2. echo "<p>Hello <span style=\"color:red\">$hello</span></p>";
  3. // heredoc: 可以解析变量,且双引号不需要转义,非常适合php+html写模板
  4. echo <<< HELLO
  5. <p>Hello <span style="color:red">$hello</span></p>
  6. HELLO;
  7. // heredoc的起始标识符可以添加双引号

4. nowdoc,可以当作单引号的plus+

适合大段的纯文本,不适合内嵌变量或特殊字符的文本

  1. echo 'This is test';
  2. // nowdoc的起始标签,必须添加单引号
  3. echo <<< 'abc'
  4. This is test<br>This is test<br>This is test<br>This is test<br>
  5. abc;
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议