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中文网', '学习php');
  7. }
  8. namespace ns2 {
  9. function learnphp($name, $webadr, $langu)
  10. {
  11. return $name . "在" . $webadr . $langu;
  12. }
  13. echo "<hr>";
  14. echo learnphp('李白', 'php中文网', '学习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 "" . $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);

更多相关文章

  1. 【Unity和Android相互调用】AndroidJavaProxy的使用(以C#为主导)
  2. android之检查service运行状态函数
  3. 《第一行代码Android(第3版)》— Android(安卓)书籍
  4. Android绘制波浪曲线,效果很赞的。
  5. 触摸按键Android的驱动解析
  6. android悬浮球,应用在所有软件之上,点击可以显示菜单
  7. PHP 编程中最常见的错误,你犯过几个?(收藏篇)-接上文
  8. C++ 容器及选用总结之函数子、函数子类、函数及其他
  9. php的explode() 函数将字符串打散为数组

随机推荐

  1. android 牛人必修 ant 编译android工程
  2. android学习笔记
  3. 【转】Android xml资源文件中@、@android
  4. Android 访问权限清单
  5. Android反编译工具绿色版V2.0(改进版)
  6. Android(安卓)Frame 动画
  7. React Native 运行android程序报SDK文件
  8. Android(安卓)之 内存管理
  9. [转]Android的应用程序结构分析:HelloActi
  10. unity与Android相互调用