欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PHP函数说明

程序员文章站 2022-03-03 23:13:38
...

PHP函数说明

* 函数是全局成员,不受作用域限制。

* php函数的作用:完成特定功能的代码块,封装成函数可以实现复用性,提高代码的可维护性。

* php内置了上千种函数可供我们直接调用,函数库文件已经编译到我们所使用的发行版中了,可以直接指定函数名称来调用,当然我们也可以自定义函数来完成特定功能。

* 函数的命名规则基本和变量的命名规则一直,可以以字母或下划线开头,后跟字母数字或下划线,但不能以数字开头,函数名不区分大小写。

* 函数有三大要素:参数,返回值,函数体。

function 函数名 (参数1, 参数2, …, 参数n){
​ 函数体;
​ return 返回值;
}

1) 在声明函数时可以没有参数列表:

function 函数名(){
​ 函数体;
​ return 返回值;
}

2) 在声明函数时可以没有返回值:

function 函数名(参数1, 参数2, …, 参数n){
​ 函数体;
}

3) 在声明函数时可以没有参数列表和返回值:

function 函数名(){
​ 函数体;
}

* 参数:可选的,对外提供一个接口,供函数调用者按照自己的意愿改变函数体内的执行行为

* 参数 形参 实参

* 默认参数:有默认值的参数,如果不传参或者少传参数,就会默认参数的值

* 参数是从左往右求值,所以默认参数放到最右边

同一个脚本不能存在同名函数,但是可以使用命名空间

  1. namespace ns1 {
  2. function learnphp($name, $webadr, $langu)
  3. {
  4. return $name . "在" . $webadr . $langu;
  5. }
  6. echo learnphp('白居易', '', '学习php');
  7. }
  8. namespace ns2 {
  9. function learnphp($name, $webadr, $langu)
  10. {
  11. return $name . "在" . $webadr . $langu;
  12. }
  13. echo "<hr>";
  14. echo learnphp('李白', '', '学习JavaScript');
  15. }
  16. namespace ns3 {
  17. // 按值传递参数 不会改变全局变量的值,导入到函数中的只是$roomprice的副本,不会更改原来的值
  18. $num = 10;
  19. $price = 100;
  20. function totalbookprice($num, $price, $discount = 1)
  21. {
  22. $price *= $discount;
  23. return $price * $num;
  24. }
  25. echo "<hr>";
  26. echo totalbookprice(2, 54, 0.8);
  27. echo "<hr>";
  28. echo totalbookprice($num, $price, 0.5);
  29. echo "<hr>";
  30. echo $price;
  31. }
  32. namespace ns4 {
  33. // 按变量引用传参 会改变父程序里变量的值 $roomprice的变量内容所处的内存地址会被导入到函数中
  34. $num = 10;
  35. $price = 100;
  36. echo "<br>" . $price . "---现在这个值还没有被更改。。。" . "<br>";
  37. function totalbookprice($num, &$price, $discount = 1)
  38. {
  39. $price *= $discount;
  40. return $price * $num;
  41. }
  42. //echo totalbookprice(2,54,0.8);//参数中有引用参数,调用时就不能直接传入参数了
  43. echo "<hr>";
  44. echo totalbookprice($num, $price, 0.5);
  45. echo "<hr>";
  46. echo $price . "---这个值已经被更改了。。。"; //50
  47. echo "<hr>";
  48. echo totalbookprice($num, $price, 0.5);
  49. echo "<hr>";
  50. echo $price . "---这个值再次被更改了。。。"; //50
  51. }

函数返回值

接口开发 函数返回值会转为通用的json格式的数据返回,这样以来就可以和其他的编程语言进行数据交互,例如js与java,php,python。

json_encode()第二个参数是一个常量,JSON_UNESCAPED_UNICODE(中文不转为unicode ,对应的数字 256),JSON_UNESCAPED_SLASHES (不转义反斜杠,对应的数字 64)。

  1. function test()
  2. {
  3. return md5('123456');
  4. }
  5. echo test();
  6. echo "<hr>";
  7. $laohuangli = file_get_contents('http://v.juhe.cn/laohuangli/d?date=2022-01-21&key=4f0b4c5**********649b98a');
  8. echo $laohuangli;
  9. echo "<hr>";
  10. $name = "%E5%8F%8C%E9%B1%BC%E5%BA%A7";
  11. $time = "month";
  12. $xingzuo = file_get_contents("http://web.juhe.cn/constellation/getAll?consName={$name}&type={$time}&key=2156088*******806b0fd32f20b");
  13. echo $xingzuo;
  • 函数属于全局成员

    * 特殊形式的函数

    * 1.匿名函数(闭包函数)

    * 2.回调函数

  • 3.递归函数

命名/匿名函数

  1. echo learn('PHP开发'); //这里也可以调用
  2. echo "<hr>";
  3. function learn(string $language): string //规定函数的返回值类型
  4. {
  5. return "我在学习" . $language;
  6. }
  7. echo learn('PHP开发');
  8. // 匿名函数 :通常会被当做回调函数的参数来使用。
  9. $nameless = function (string $lev): string {
  10. return "PHP中文网" . $lev;
  11. };
  12. echo "<br>" . $nameless('天下第一') . "<br>";
  13. // 闭包引来(变量)作用域的问题
  14. // 全局变量是指声明在函数外部的变量,在函数内部访问不到。
  15. // 局部变量是指声明在函数内部的变量,只能在函数内部被访问到。
  16. // 1. global
  17. // 2. 超全局数组$GLOBALS $_GET $_POST
  18. // 3. 闭包函数借助关键字use
  19. // 闭包改变变量上下文的值 需要引用传递
  20. $myname = '李白';
  21. $email = 'libai@php.cn';
  22. function libai()
  23. {
  24. // global $myname,$email;
  25. $honor = '诗仙';
  26. return "恭喜" . $GLOBALS['myname'] . "注册邮箱---" . $GLOBALS['email'] . "成功";
  27. }
  28. echo libai();
  29. echo "<hr>";
  30. $anothername = '杜甫';
  31. $anoemail = 'dufu@php.cn';
  32. $dufu = function ($honor) use ($anothername, $anoemail) {
  33. return "恭喜{$honor}{$anothername}注册邮箱----{$anoemail}成功";
  34. };
  35. echo $dufu('诗圣') ;
  36. echo "<br>" . $anothername . "----此时,全局变量未被改变";
  37. $changename = function($newname) use (&$anothername){
  38. $anothername = $newname;
  39. return $newname;
  40. };
  41. echo "<hr>";
  42. echo $changename('苏轼');
  43. echo "<br>" . $anothername . "----此时,全局变量已经被改变";//此时,全局变量已经被改变

回调函数

* 回调函数:php回调是指在主线程函数执行的过程中,突然跳去执行设置的回调函数,回调函数执行结束后, 再回到主线程处理接下来的流程

* 匿名函数最通常作为回调函数的参数使用

php脚本是单线程,脚本是同步执行的,如果遇到耗时函数将会发生线程阻塞的问题,应该将它改为异步回调的方式执行

call_user_func()把第一个参数作为回调函数调用

call_user_func_array()

回调的是全局函数

  1. //示例:// 给到一个任意数组,把数组中的偶数筛选出来,组成一个新数组 返回 然后计算新数组所有偶数的和
  2. $manynum = [12, 432, 432, 54, 52, 65, 22, 456, 893];
  3. //匿名函数
  4. $odd = function (array $arrs) {
  5. for ($i = 0; $i < count($arrs); $i++) {
  6. if ($arrs[$i] % 2 == 0) {
  7. $newarrs[] = $arrs[$i];
  8. }
  9. }
  10. return $newarrs;
  11. };
  12. var_dump($odd($manynum));
  13. // 求和 params 第一个参数是一个匿名函数,第二个参数是一个任意数组
  14. function sum(Closure $func, $manynum)
  15. {
  16. $addodd = $func($manynum);
  17. return array_sum($addodd); //内置求和函数
  18. }
  19. function sums(array $arrplus){
  20. return array_sum($arrplus);
  21. }
  22. echo "<hr>";
  23. echo sum($odd, $manynum);// 输出调用,传入匿名函数跟数组
  24. echo "<hr>";
  25. $sumplus = call_user_func($odd, $manynum);
  26. var_dump($sumplus);
  27. echo "<hr>";
  28. echo sums($sumplus);

递归函数

递归函数即自调用函数,也就是函数在函数体内部直接或间接地自己调用自己。需要注意的是使用递归函数时通常会在函数体中附加一个判断条件,以判断是否需要继续执行递归调用,当条件满足时会终止函数的递归调用。

  1. <?php
  2. //递归函数
  3. function factorial($num)
  4. {
  5. //确定递归函数的出口
  6. if ($num == 1) {
  7. return 1;
  8. } else {
  9. return $num * factorial($num - 1);
  10. }
  11. }
  12. echo '15 的阶乘是:' . factorial(15);
  13. echo '<hr>';
  14. //计算斐波那契数列
  15. function demo($num)
  16. {
  17. if ($num == 1 || $num == 2) {
  18. return 1;
  19. } else {
  20. return demo($num - 1) + demo($num - 2);
  21. }
  22. }
  23. echo '数列第 10 位是:' . demo(10);