php函数中可变数量的参数列表及三个点语法

php函数中可变数量的参数列表及三个点语法

PHP 在用户自定义函数中支持可变数量的参数列表。在 PHP 5.6 及以上的版本中,由 ... 语法实现;在 PHP 5.5 及更早版本中,使用函数 func_num_args(),func_get_arg(),和 func_get_args() 。

最近在看laravel框架的时候,看到了三个点语法(...$param)
Illuminate\Database\Eloquent\Model 类中

public static function __callStatic($method, $parameters)
{
    return (new static)->$method(...$parameters);
}

当调用到未定义的静态方法时,此魔术方法被调用,$method为方法名,$parameters为此方法传递的多个参数组成的数组,参数个数及类型未知,在调用的时候使用...语法,就可以将参数拆分成参数列表传递给$method函数。

我们知道laravel或thinkphp的查询构造器的参数传递是很灵活的,因此,...语法在函数封装上就很方便了。

当然$method函数也可以定义为只接收一个数组参数,这样就不用使用...语法了;只是这样定义的函数可读性较差,无法一眼就看出的函数使用。

用法:
在定义函数的时候和普通的函数一样的,就是在调用的时候传参加三个点

调用:
public function __call($method, $parameters)
{
    if (in_array($method, ['increment', 'decrement'])) {
        return $this->$method(...$parameters);
    }

    return $this->newQuery()->$method(...$parameters);
}

定义:
protected function increment($column, $amount = 1, array $extra = [])
{
    return $this->incrementOrDecrement($column, $amount, $extra, 'increment');
}


三个点语法还有一种使用方式:
1、多个变量-->一个数组
在定义的时候使用三个点语法,在调用的时候传递参数列表,参数列表将会自动组合成数组穿个函数了。
function sum(...$numbers) {
    print_r($numbers);
}

echo sum(1, 2, 3, 4);

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)

2、一个数组-->多个变量
 条件是:$param是索引数组,如果是关联数组会报错
 function a($param){
    var_dump(...$param);
    test(...$param);
 }
 a([1,2,'b']);

 int(1)
 int(2)
 string(1) "b"

test()方法需要传递传递多个变量。

你可能感兴趣的:(PHP)