値による受け渡し
関数のスコープ内での値の変更は関数の外では無視されます。値による受け渡しでは、 value. 、2 つの変数は 2 つのメモリ アドレスを指します。
$a = 6; $b = $a; // 这是值传递,把 $a 的值拷贝给了 $b,在内存中 $a 和 $b 不在一个地址中,更改任意变量的值对对方无影响 $b = 7; echo $a; // 输出:6 function foo($b){ echo ++$b; } foo($b); // 输出:8 echo $b; // 输出:7 说明函数内的改变对函数外的值没有影响,因为,当 $b 传入函数内的时候是值传递, 会把值在内存中拷贝一份存入一个新的内存地址中
参照渡し
関数スコープ内の値への変更は、関数の外側にも反映されます。参照渡しとは、変数 メモリ アドレス識別子は内部と外部の変数に渡され、最終的に 2 つの変数は同じメモリ アドレスを指します。
$a = 6; $b = &$a; $b = 7; echo $a; // 输出:7 function foo(&$c){ echo ++$c; } foo($b); // 输出:8 echo $b; // 输出:8 说明函数内的改变对函数外的值有影响,因为,当 $b 传入函数内的时候是引用传递, 函数体内的$b和外部的$b实际上是指向同一个内存地址,所以一个改变,另外一个变量的值也会改变
function func(&$arr){ $arr['a'] = []; $arr = &$arr['a']; $arr['b'] = '333'; var_dump($arr); } $arr = [ 'a' => '111', 'b' => '222' ]; func($arr); var_dump($arr); /** # 第一个输出: array(1) { ["b"]=> string(3) "333" } # 第二个输出: array(2) { ["a"]=> array(1) { ["b"]=> string(3) "333" } ["b"]=> string(3) "222" } */
上の例は明らかに参照によって渡されていますが、なぜ 2 つの $arr が異なる結果を出力するのでしょうか?
ステップ操作 $arr = &$arr['a']; があるため、このステップの後、関数内の $arr の指すアドレスが変更され、$arr['a'] を指すようになりました。 2 つの印刷物はどれも同じではありません。
注: PHP のオブジェクトのデフォルトの値渡しは、通常、関数本体内で渡すパラメーターを変更する必要がある場合や、外部変数に影響を与える必要がある場合に使用されます。は通常、他のときに使用されます。
推奨チュートリアル: PHP ビデオ チュートリアル
以上がPHPでの参照渡しと値渡しの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。