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 />\n";
    if ($numargs >= 2) {
        echo "Second argument is: " . func_get_arg(1) . "<br />\n";
    }
    $arg_list = func_get_args();
    for ($i = 0; $i < $numargs; $i++) {
        echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
    }
}

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 />\n";
    if ($numargs >= 2) {
        echo "Second argument is: " . func_get_arg(1) . "<br />\n";
    }
    $arg_list = $args;
    for ($i = 0; $i < $numargs; $i++) {
        echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
    }

}

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);
可以看到新的變參形式不斷好理解,而且書寫優雅。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM