Blogger Information
Blog 16
fans 0
comment 0
visits 15799
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
php.cn_week5_day2作业提交【函数】
Allen在php中文网的学习笔记
Original
627 people have browsed it

作业内容

  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;
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