• PHP可变长度参数列表的实用技巧


    原文链接:https://my.oschina.net/cxz001/blog/825671

    php5.6添加了一个新的特性,那就是 可变长度参数列表 , 它提供了什么便捷的语法特性呢?

    两个例子:

    1.可变长度的形参

    function foo($name, ...$options)
    {
       foreach ($options as $val) echo($val);
    }
    
    foo('aaa','bbb','ccc','ddd');
    //输出的应该是  'bbbcccddd';

    这个主要说明使用可变长度形参比原始的 func_get_args() 获取函数参数数组更加方便。

    2.可变长度的实参

    function foo($name, $value)
    {
       echo $name.':'.$value;
    }
    
    $args = ['k1','v1'];
    foo(...$args);
    //输出 k1:v1

    恩,这个看上去好像跟 call_user_func_array 没什么区别哈 ,写法上简洁一些。

    如果仅仅是把两个例子分开看 ,都没有令人心动的感觉,也就是锦上添花罢了,但是看接下来的例子,这是一个需要对另外一个类方法进行封装的场景

    class A
    {
        function foo($a,$b,$c='',$d=''){}
    }
    
    
    //class B 需要调用 class A的foo方法,但是除了第一个参数之外,所有参数原样传递给 A::foo
    
    class B
    {
        //$a,$b,$c='',$d='' 原样定义
        function foo($x,$a,$b,$c='',$d='')
        {
            //手动填写每个实参
            (new A)->foo($a,$b,$c,$d);
        }
    }

    首先B需要知道A::foo方法的所有参数定义,重复定义一次,然后调用的时候还需要逐个传递参数,这一看就感觉很不好,万一 A::foo 定义发生变化,B也要跟着改。

    现在有了可变长度参数,我们可以这样写了

    class A
    {
        function foo($a,$b,$c='',$d=''){}
    }
    
    
    //class B 需要调用 class A的foo方法,但是除了第一个参数之外,所有参数原样传递给 A::foo
    
    class B
    {
        //通过可变长度形参,不需要知道A::foo的定义
        function foo($x,...$args)
        {
            //把 $args 通过可变长度实参功能原封不动传给 A::foo
            (new A)->foo(...$args);
        }
    }
    
    $b = new B;
    $argsForA = [1,2];
    $b->foo('x', ...$argsForA);//可变长度实参

    是不是瞬间感觉解放了 

  • 相关阅读:
    跨域处理
    intellij idea远程调试
    sring boot特性
    spring mvc与struts2的区别
    jenkins集成sonar
    hibernate笔记
    python脚本
    python 字符框
    python操作
    python环境配置
  • 原文地址:https://www.cnblogs.com/csjboke/p/16073735.html
Copyright © 2020-2023  润新知