12

次のように宣言された任意の関数の場合:

function foo($first, &$second = null) {
    // if ($second is assigned) {
    //     Work with $second
    // }
}

$second呼び出し時に実際に変数に割り当てられているかどうかをどのように判断しますか。例:

foo('hello', $second);

vs

foo('hello'); // Notice &$second is unassigned

試しましisset()is_null()が、機能していないようです。

アップデート:

ここでテストスクリプトを作成しました

4

4 に答える 4

3

のようなものを実装する関数を実装したいと思っているのは私の理解ですpreg_match。これにより、3番目の引数が渡されると、メモリパターンが入力されます。

zend_parse_parameters()内部的には、PHP関数は;と呼ばれる関数を使用します。フォーマット文字列と、呼び出しパラメータのメタデータが入力される可変数の引数を受け入れます。パラメータが渡されない場合(たとえば、オプションの場合)、メタデータは利用できないため、簡単に検出できます。

PHP自体に戻ると、残念ながら、関数の引数として渡されたfunc_arg_used($var)かどうかを示すようなものはありません。$varおそらくこれは言語への興味深い貢献になるでしょうが、それまではもっと古いものに落ち着く必要があります:)

if (func_num_args() > 1) {
    // $second was passed and can be used to populate
}

$second関数のシグネチャを変更するとき、特に;の前にパラメータを追加するときは、注意が必要な場合があります。ただし、当然、これは頻繁に発生することはありません。これは、依存する関数を確実に破壊するためです。最後に引数を追加しても、上記のコードには影響しません。

これを使用する方法は2つあります。

  1. ReflectionFunction-開発者の輝かしい新しいおもちゃ。関数を内省し、署名が作成されたときから変更されたかどうかを判断できます。ただし、特に代替案を考慮すると、内省は安価ではありません。

  2. 謙虚なコードコメント-非常に控えめな形式のコードポリシング。と言う簡単な行// IMPORTANT - don't add arguments before $second

于 2012-10-29T12:09:55.843 に答える
1

issetを使用して、NULLとUndefinedの違いを(私が知る限り)見分けることはできません。デフォルト値の$secondを、他の方法では使用されないランダムな値に設定できます。

define('UNDEFINED', -19181818);

function foo($first, &$second = UNDEFINED) 
{
 if($second==UNDEFINED)
 {
  etc..
 }
}
于 2012-10-28T17:24:41.990 に答える
1

私のために働く

<?php

function bool_str($b)
{
    return ($b ? "true" : "false");
}

function foo($first, &$second = null)
{
    echo bool_str(isset($first)) . " " . bool_str(isset($second)) . " " .
         bool_str(is_null($first)) . " " . bool_str(is_null($second)) . "\n";
}

$a = 1;
$b = 2;

foo($a, $b);
foo($a);

?>

出力:

true true false false
true false false true
     ^^^^^       ^^^^

これはまさに私が期待することです。つまり、issetis_nullここの両方を使用できます。

于 2012-10-28T18:10:54.210 に答える
1

func_num_args()を使用するというJackの提案は素晴らしいと思います。

function foo($first, &$second = null) {
    if (func_num_args() > 1) {
        //$second MUST be assigned
    }
}

これは、呼び出し元のスコープのシンボルテーブルに存在する変数を参照するときに適切に検出し$secondますが、変数値はnullです。

$second = null;
foo('hello', $second);
于 2012-10-28T18:30:31.067 に答える