1

PHPで、関数パラメーターがターゲット変数を参照するようにする場合は、アンパサンド記号を使用することを知っています&。しかし、次のシナリオ(変数がリクエストから収集される場合)でそれがまだ有効で信頼できるかどうかはわかりません。

$v1 = $_POST['v1'];

function filled(&$var) {
    return isset($var) && !empty($var);
}

if (!filled($v1)) // etc.

またはこのシナリオでも:

$v1 = $_POST['v1'];
$v2 = $_POST['v2'];

function filled() {
    $args = &func_get_args(); // does this even take the references and not the values?
    foreach ($args as &$arg) {
        if (empty($arg) || !isset($arg)) return false;
    }
    return true;
}

if (!filled($v1, $v2)) // etc.

明確化していただきありがとうございます。

4

2 に答える 2

2

参照は、変数がユーザー定義であるか、PHP スーパーグローバルからのものであるかを気にしないため、まだ有効ですが、最初の例にはいくつかの問題があります。

まず、いつ行うかは変数$v1 = $_POST['v1']; $v1に依存しなくなりました。コピーを作成したため、への$_POST['v1']変更$v1は反映されません。$_POST['v1']

あなたができること:$v1 = &$_POST['v1'];それへの参照を作成する。

次に、isset関数内で を呼び出すと、常に true が返されます。 isset関数ではなく、特殊な言語構造です。$_POST['v1']が設定されていない場合、 to$v1の代入後も設定されます (ただし null になります) 。$_POST['v1']$v1

また、私が知る限り、func_get_args()参照はサポートされていません。返される値はすべて元のコピーです。

これでいくつかの疑問が解決しましたか? そうでない場合は、明確にしたいことについてお気軽にお尋ねください。

于 2012-04-19T00:05:11.017 に答える
1

$varシナリオ 1:関数パラメーターとして常に設定されるため、必要な処理が行われません。ただし、このパラメーターに空の値 (null、false など) が含まれていないかどうかを確認したい場合は、 を実行できますempty($var)。そこで使う必要はありません&。あなたが望むことは、として行うことができます!empty($_POST['v1')。関数に何かを渡す場合、値が必要なので、isset()in function を使用しても何も起こりません。array_key_existsまたはisset()またはempty()外側のいずれかを使用します。

シナリオ 2:func_get_args()は必要ありません&。ドロップします。$argもそれを必要とせず、常に設定されるため、isset()チェックempty()は役に立ちますが、役に立ちません。上記のように、配列キーが存在するかどうかを確認したい場合は、isset($_POST['v1'])またはを使用します!empty($_POST['v1'])

于 2012-04-19T00:08:38.867 に答える