tohokuaikiのチラシの裏

技術的ネタとか。

PHPの可変長引数について、コンストラクタでそのまま渡せるのか確かめた

要するに、クラスを継承した時に引数の呼び出し方を変えたくないということなんだけど。

親クラスの __constructの引数の実装を知らなくても良いようにしたいということ。

ダメだったケース

<?php
class ArgsP
{
    function __construct(... $args){
        var_dump($args); 
    }
}
class ArgsC extends ArgsP
{
    function __construct(... $args){
        parent::__construct($args);
    }
}
new ArgsC(1, 2, 3);

ってすると、

array(1) {
  [0] =>
  array(3) {
    [0] =>
    int(1)
    [1] =>
    int(2)
    [2] =>
    int(3)
  }
}

ってなってしまった。当たり前やん。

呼び出す時も... を使った可変長引数を使えばO.K

こんな感じ。

<?php
class ArgsP
{
    function __construct(... $args){
        var_dump($args); 
    }
}
class ArgsC extends ArgsP
{
    function __construct(... $args){
        parent::__construct(... $args);
    }
}
new ArgsC(1, 2, 3);

これで結果が

array(3) {
  [0] =>
  int(1)
  [1] =>
  int(2)
  [2] =>
  int(3)
}

ってなる。やった~。