1

これは私が知っている基本的な質問のようですが、答えを見つけることができませんでした。

基本的な機能を仮定しましょう:

function basicFunction ( $var1, $var2 = 1, $var3 = 2, $var4 = 5 )
{
// Do some stuff
// Return
}

次に、次の変数を使用してその関数を呼び出したいとします。

$var1 = 0

$var2 = 1

$var3 = 2

$var4 = 3

私がすることができます:

$someResult = basicFunction( 0, 1, 2, 3 );

$var2とは既に設定されていますが、と$var3の値を繰り返さずに関数を呼び出すにはどうすればよいでしょうか?$var2$var3

4

9 に答える 9

4

PHP はオーバーロードをサポートしていません。したがって、引数リストの一番右に移動しない限り、それらをスキップすることはできません。

一般的な解決策は、予想とは異なる型 (NULL など) のデフォルト値を設定することです。次に、実際のデフォルト値が関数内で設定されます。このアプローチはあまりクリーンではなく、追加のコード行が必要ですが、状況に応じて次のようにすることもできます。

function basicFunction($var1, $var2 = NULL, $var3 = NULL, $var4 = NULL) {
    if ($var2 === NULL) {
        $var2 = 1;
    }

    // ...
于 2012-06-04T13:03:26.227 に答える
1

現在、PHP 8 で可能です。詳細については、この回答を参照してくださいhttps://stackoverflow.com/a/64997399/519333


古い答え:

function my_function(
    $id,
    $start = 0,
    $limit = 10,
    $filter = false,
    $include_duplicates => false,
    $optimize_fetch => false,
    $cache = false
) {
    if (is_array($id)) extract($id, EXTR_IF_EXISTS);

    /* ... */
}

その後

my_function(array('id' => 1, 'cache' => true));

ソース: http://www.marco.org/2008/11/11/faking-named-parameters-in-php

于 2012-06-11T16:39:22.727 に答える
0

パラメータリストの最後に$var2andを付ける必要があります$var3

function basicFunction ( $var1, $var4 = 5, $var2 = 1, $var3 = 2)

これで、次のように呼び出すことができます。

basicFunction( 0, 3);

それ以外の場合は、すべてのパラメーターを指定する必要があります。関数を呼び出すときは、すべてのパラメーターを左から右に指定する必要があります。パラメータを省略できるのは、次の場合のみです。

  1. 省略したいパラメータにデフォルト値がある場合。
  2. 現在のパラメータの右側にあるすべてのパラメータにはデフォルト値があります。
于 2012-06-04T13:01:34.260 に答える
0

何らかの方法で変数を配列として渡すことを考えましたか? その場合、更新する必要がある変数のみを含めます

function basicFunction ( $arrayvar ){
    $arrayvar['var1']...

更新: また、ここで最初の機能のfunc_get_args()ように機能する -function を使用することもできます

于 2012-06-04T13:05:08.893 に答える
0

連想配列によって関数を呼び出すことができるこの関数を作成しました。ただし、スカラー型でのみテストしましたがints、 、floatsstrings、およびを受け取る関数に対しては正常に機能するはずbooleansです。私はこれを非常に速く書きましたが、間違いなく複数の方法で改善できます。

function call_user_func_assoc($function, $array){
    $matches = array();
    $result = array();
    $length = preg_match_all('/Parameter #(\d+) \[ <(required|optional)> \$(\w+)(?: = (.*))? ]/', new ReflectionFunction($function), $matches);

    for($i = 0; $i < $length; $i++){
        if(isset($array[$matches[3][$i]]))
            $result[$i] = $array[$matches[3][$i]];
        else if($matches[2][$i] == 'optional')
            $result[$i] = eval('return ' . $matches[4][$i] . ';');
        else
            throw new ErrorException('Missing required parameter: $' . $matches[3][$i]);         
    }

    call_user_func_array($function, $result);
}

次のように使用できます。

function basicFunction($var1, $var2 = "default string", $var3 = 2, $var4 = 5){
    var_dump(func_get_args());
}

call_user_func_assoc('basicFunction', array('var1' => "Bob", 'var4' => 30));

どの出力:

array(4) {
  [0]=>
  string(3) "Bob"
  [1]=>
  string(14) "default string"
  [2]=>
  int(2)
  [3]=>
  int(30)
}
于 2012-06-04T13:53:45.070 に答える
0

残念ながら、php はそのようには機能しないと思います。
変更する場合は、関数宣言の前にand$var4を含める必要があります。$var2$var3$var4

デフォルト値を使用して配列を関数に渡し、値のみを変更する$var4か、nickb が提案したように順序を変更することができます。

http://www.php.net/manual/en/functions.arguments.php#functions.arguments.default

PHPでオプションのパラメータ値を指定する方法はありますか?

于 2012-06-04T12:59:35.527 に答える
-1

上記のコメントで述べたように、php 引数は左から右に評価されるため、常にオプションの変数を右端に保持する必要があります。ただし、この場合、次のように、重複した値を取り除くためにいくつかのトリックを実行できます。

$var2 = 1, $var3 = 2, $var4 = 5;
function basicFunction($var1, $var2 = null, $var3 = null, $var4 = null) {
    if($var2 === null)
        $var2 = $GLOBALS["var2"];
    if($var3 === null)
        $var3 = $GLOBALS["var3"];
    if($var4 === null)
        $var4 = $GLOBALS["var4"];
}

ただし、引数を巧みに再配置することで、この状況を解決したほうがよいでしょう。

于 2012-06-04T13:03:13.697 に答える
-1

値をスキップするには、次のようにしてください

     $someResult = basicFunction( 0, 0, 0, 3 ); 

または、値が設定されている場合

       // passing values stored in var2,var3

       $var1 = 1;
       $var2 = 2;

    $someResult = basicFunction( 0, $var1, $var2, 3 );
于 2012-06-04T12:57:56.057 に答える