PHPの関数にPythonでいうキーワード引数を試みる。


おはようございます、こんにちわ、こんばんわ、阿部です。
日曜日の昼、如何お過ごしですか。
僕は、一杯やりながらコードを書いてます。





ってなわけで本題です。

PHPPythonのキーワード引数をやりたくなったわけですわ

Python

In [1]: def hoge(a=1, b=2, c=3):
   ...:     return a, b, c

In [2]: print hoge()
------> print(hoge())
(1, 2, 3)

In [3]: print hoge(c=5)
------> print(hoge(c=5))
(1, 2, 5)

便利ですね。デフォルト引数を指定したやつのみ指定出来るってわけです。




PHPで普通にやろうとすると、、

PHP

function hoge($a=1, $b=2, $c=3){ 
    return $a." ".$b." ".$c; 
}
print hoge($c="5"); // 5 2 3

ってなっちゃうわけです。普通に第一引数目に5が入るだけ。




んで、なんとか出来ないか色々試したけど、結論から言うと、出来ないっぽいですね。
func_get_argsとか使って色々試してみたけど、出来なかったっす。
(僕の知識不足、技量不足なだけかもしれないんで、もしやり方をご存知の方は教えて欲しいっす。)



■仕方ないから、代わりにeval使ってやってみました。

PHP

<?php

function hoge($arr=array()){

    // デフォルト引数指定
    $a = 1;
    $b = 2;
    $c = 3;

 // 配列を分解してevalでキーを変数として格納
    if(is_array($arr)){
        foreach($arr as $key => $value){
            if(!empty($key) && !is_numeric($key)){
                eval("$$key = $value;");  // 「$c = 5」とかやってます
            }
        }
    }


    return $a." ".$b." ".$c."\n";
}


$arg1 = array();
print hoge($arg1);  // 1 2 3

$arg2['c'] = 5;
print hoge($arg2);  // 1 2 5

$arg3['a'] = 3;
$arg3['b'] = 4;
print hoge($arg3);  // 3 4 3

$arg4['d'] = 5;
print hoge($arg4);  // 1 2 3


自分としては、要件満たしてるしこれでいいかなと、、、
なんか他にいいのあったら教えてください!!!!!!!