实例演示函数作用域与闭包,回调的使用场景与参数调用; 2. 实例演示函数的多值返回类型方式,重点是json

函数

  1. 语法:
  1. function 名称(类型限定 参数):返回类型{
  2. //函数体
  3. //return 返回值,没有return 返回null
  4. }

2.分类

  • 命名函数
    自动提升到脚本的顶部,在全局任何地方都可以调用
  1. function demo1(){
  2. return 'hello';
  3. }
  4. echo demo1();
  • 匿名函数
  1. $demo2=function(){
  2. return 'php.cn';
  3. }
  4. echo demo2();

函数参数

  1. 必选参数
  1. function demo3(string $name): string
  2. {
  3. return "hello $name !";
  4. }
  5. //将标量(单值)会自动转为字符串
  6. echo demo3(123);
  7. echo demo3(true);
  1. 可选参数
  1. function demo4(string $name='hello world'): string
  2. {
  3. return "hello $name !";
  4. };
  5. echo demo4();
  6. //当有多个参数时,可选参数必须放在后面
  7. // 因为调用的时候如果不传参默认输出的话,得想办法空出来可选参数

3.不定参数

  1. function demo5(){
  2. //参数有几个
  3. $n=func_num_args();
  4. //参数组成的数组
  5. func_get_args();
  6. //获取某一个参数
  7. $arg=func_get_args()[1];
  8. //参数求和
  9. array_sum(func_get_args());
  10. //不推荐使用以上三个函数了,有更简便的替代...rest
  11. }
  12. demo5(1,2,3);

简化为:

  1. function demo6(...$args){
  2. //参数有几个
  3. $n=count($args);
  4. //参数组成的数组
  5. $args;
  6. //获取某个参数
  7. $arg=$args[1];
  8. }

4.引用参数
在函数内部对参数的任何更新都会实现映射到外部的参数中

  1. $name='小红';
  2. function demo7(string &$name){
  3. $name='小明';
  4. }
  5. echo "\$name=$name"; //小红
  6. echo demo7($name);
  7. echo "\$name=$name"; //小明

函数返回值

只允许有一个返回值,返回多值,只能在返回值的类型上动手脚
1.数组

  1. function demo8():array
  2. {
  3. return ['ab'=>1,'cd'=>2];
  4. };

2.对象

  1. function demo9():object
  2. {
  3. //匿名类
  4. return new class(){
  5. public $name='admin';
  6. public $email='admin@php.cn';
  7. };
  8. }

3.序列化字符串
如果有一些数据需要进行网络传输或保存到文件或数据表中的时候要用到它,如果这个序列化的数据只在php程序中使用,应该使用php内置的方法

  1. function demo():string
  2. {
  3. return serialize(['ab'=>1,'cd'=>2]);
  4. };
  5. //返回序列化的字符串
  6. $str=demo();
  7. //在php中使用时要还原成原来的类型
  8. $arr=unserialize($str);

4.转为通用的json格式的字符串

  1. function demoo():string
  2. {
  3. //JSON_UNESCAPED_UNICODE 处理中文
  4. return json_encode(['ab'=>1,'cd'=>'小红'],JSON_UNESCAPED_UNICODE);
  5. };
  6. echo $str=demoo();
  7. //当前脚本接收到一个前端或其他接口发送过来的json格式的数据,可以进行解析
  8. $res=json_decode($str);//将外部json解析成对象类型
  9. $res=json_decode($strtrue);//将外部json解析成数组类型

函数作用域

  1. $name="小王";
  2. $email='1747615798@qq.com';
  3. function demo1():string
  4. {
  5. $res='';
  6. //如果想在函数内部访问全局/外部的成员
  7. //两种方式可以在函数内部访问外部成员
  8. // 1.global
  9. global $name;
  10. $res.='name='.$name;
  11. //2.$GLOBALS
  12. $res.='email='.$GLOBALS['email'];
  13. return $res;
  14. }
  15. echo demo1();

闭包

闭包:匿名函数,可以访问函数外部的自由变量/父作用域中的变量

  1. $name="小王";
  2. $demo2=function()use($name)
  3. {
  4. return $name;
  5. };
  6. echo $demo2();

闭包支持引用传参,参数前加 &

  1. $demo3=function($myname) use(&$name)
  2. {
  3. return $name=$myname;
  4. };
  5. $demo3('小蓝');

注意:use禁止使用一下三种参数
1.超全局不让用
2.$this
3.与当前参数重名不让用

回调函数

php单线程,同步执行,如果遇到耗时函数会发生阻塞,应该将它改为异步回调执行

  • call_user_func(函数名,参数列表)
  • call_user_func_array(函数名,参数列表数组)
    1. function demo4(string $name) :string
    2. {
    3. return $name;
    4. }
    5. echo call_user_func('demo4','小明');
    也可用对象上
  1. class User{
  2. public function hello($name):string
  3. {
  4. return $name;
  5. }
  6. public static function say(string $site):string
  7. {
  8. return $site;
  9. }
  10. }
  11. //普通方法
  12. $res=call_user_func_array([new User,'hello'],['小红']);
  13. echo $res;
  14. //静态方法
  15. $site=call_user_func_array(['User','say'],['小李']);
  16. //也可简写
  17. $site=call_user_func_array('User::say',['小李']);
  18. echo $site;
静态变量
  1. function demo(){
  2. //函数中的静态变量不会随函数调用结束而消失
  3. //它会自动进入到下一次的函数调用中
  4. //可以实现函数的多次调用过程中:共享数据/数据通信
  5. static $i=1;
  6. echo $i;
  7. $i++;
  8. }
  9. echo demo();
  10. echo demo();
  11. echo demo();

更多相关文章

  1. 函数作用域与闭包、回调使用场景与参数调用、函数的多值返回
  2. 面向对象与函数式编程的简单案例
  3. 函数作用域与闭包-回调与参数-函数多值返回类型方式
  4. 0108-JSON二个函数,get,post发起ajax请求,理解跨域的原理
  5. 函数的声明与定义
  6. 一次List对象去重失败,引发对Java8中distinct()的思考
  7. 后浪,谈谈你对jvm性能调优的理解
  8. [android] Bundle savedInstanceState的作用
  9. android官网demo之缩放view

随机推荐

  1. 使用Android-UIL,如何停止下载?
  2. ViewPager的滑动禁止和滑动启动
  3. android发送通知及更新通知
  4. PacketReader 如何实现smack数据监听机制
  5. 第一个Android程序
  6. android中Appwidget的使用
  7. 在谷歌中映射V2…fragment.getMap()返回n
  8. 不同Android版本设备正确获取屏幕分辨率
  9. Android开发——联系人中几种常见的mimet
  10. android surfaceview里onTouchEvent 画图