3

私の PHP Web ページには、グローバル配列があります。

$test = array();

次に、この関数を呼び出します。

function f () 
{
    global $test;

    init( $test );
    $test['foo'] // Error: undefined index "foo"
}

次に、この関数を呼び出します。

function init ( $test )
{
    $test['foo'] = 'bar';
    $test['foo'] // evaluates to'bar'
}

ご覧のとおり、エラーが発生します。内部の配列に追加した「foo」フィールドが保持されinit()ませんでした。なぜこれが起こるのですか?$test内部のグローバルを変異させていると思ってinit()いましたが、そうではないようです。ここで何が起こっているのinit()ですか?どうすれば持続する「foo」フィールドを内部に設定できますか?

4

3 に答える 3

3

参照渡し$testinitはなく、値渡しです。$test内部は、initたまたま global の値を含むローカル変数です$test

initの関数シグネチャを変更して、配列を参照渡しする必要があります。

function init ( &$test )
{
    $test['foo'] = 'bar';
    $test['foo'] // evaluates to'bar'
}

で使用global $testinitます。

function init ()
{
    global $test;

    $test['foo'] = 'bar';
    $test['foo'] // evaluates to'bar'
}

またはinit配列を返す必要があります(つまり、実行する必要があります$test = init( $test );):

function init ( $test )
{
    $test['foo'] = 'bar';
    $test['foo'] // evaluates to'bar'

    return $test;
}
于 2012-10-30T19:18:10.300 に答える
2

配列は自動的に参照渡しされません。したがって、 init $test は配列のコピーです。

たとえば、参照によって渡す必要があります。

function init (&$test) {

または、より良いアプローチは、init から返すことです。

于 2012-10-30T19:17:07.403 に答える
2

変数を変更する場合は、変数を参照渡しする必要があります。

function init ( &$test )
{
    $test['foo'] = 'bar';
    $test['foo'] // evaluates to'bar'
}
于 2012-10-30T19:17:27.537 に答える