zoukankan      html  css  js  c++  java
  • PHP可变参数

    0x00 缘起

    在laravel的源码里经常可以看到下面的函数形式

    $func(...$args)

    0x01 可变参数旧写法

    这表示$func支持可变参数,在php5.6之前则是在函数体内调用 func_get_args(),获取多参数

    <?php
    function foo()
    {
        $numargs = func_num_args();
        echo "Number of arguments: $numargs<br />
    ";
        if ($numargs >= 2) {
            echo "Second argument is: " . func_get_arg(1) . "<br />
    ";
        }
        $arg_list = func_get_args();
        for ($i = 0; $i < $numargs; $i++) {
            echo "Argument $i is: " . $arg_list[$i] . "<br />
    ";
        }
    }
    
    foo(1, 2, 3);

    func_num_args是获取参数的个数,func_num_arg是获取索引处的参数值。

    如果只看函数名的话,估计都以为它是个参数为空的函数吧,而且还需要额外调用辅助函数来获取参数列表。

    0x02 新语法,新用法

    现在让我们看看php5.6的新变参语法...$args。

    function foo(...$args)
    {
        $numargs = count($args);
        echo "Number of arguments: $numargs<br />
    ";
        if ($numargs >= 2) {
            echo "Second argument is: " . func_get_arg(1) . "<br />
    ";
        }
        $arg_list = $args;
        for ($i = 0; $i < $numargs; $i++) {
            echo "Argument $i is: " . $arg_list[$i] . "<br />
    ";
        }
    
    }
    
    foo(1,2,3);

    另外...$args可以直接传数组,支持在内部解包,这样先在外部把参数组装好,更优雅,如

    
    $args = [1,2,3];
    foo(...$args);

    注意参数列表的数组不能是关联数组。

    0x03 扩展

    laravel中可以看到$instance->$method(...$args);,怎么改写为php5.6以下的呢?
    想想调用自定义函数,对就是call_user_func_array,可以改写为如下形式:
    call_user_func_array([$instance,$method], $args);
    可以看到新的变参形式不断好理解,而且书写优雅。

  • 相关阅读:
    【C#】SuperSocket配置启动UDP服务器
    【UWB】DWM1000 室内定位串口协议说明
    【Unity3D】把相机视角放置到编辑器当前位置视角
    【DXP】如何在原理图中批量修改
    request中的gizp提交解析以及提交请求
    java基础知识----循环
    pymongo.errors.CursorNotFound: Cursor not found
    xposed入门(二)---hook方法入参
    VulnHub靶场篇9-SkyTower: 1
    VulnHub靶场篇8-IMF:1
  • 原文地址:https://www.cnblogs.com/twodog/p/12139762.html
Copyright © 2011-2022 走看看