参照渡しを利用するとコードを追いにくくなるから利用は非推奨。特に関数の引数に利用するパターンはだめ。
参照渡しで行う実装は、参照渡しなしで実装できるからね。
でも他の人が書いたコードは読めないといけないし、改修しないといけないから。読める必要はあるよ。
もくじ
参照渡しによる 変数・配列の加工(非推奨)
引数の変数の左に&を加えることで加工処理に使えます。
<?php $number = 1; refSum($number); echo $number; unset($number); // unset()してメモリ解放おく function refSum(int &$number): void { $number += 5; }
引数に&$numberを入れることで加工できる
実行結果
6
ただこのパターンは追いにくくなるので利用しない
だから、
returnの形で使います
<?php $number = 1; $number = refSum($number); echo $number; function refSum(int $number): int { return $number += 5; }
通常このように実装します。
配列の加工
まずは配列とループの基本原則
<?php $users = [ [ 'name' => "Yuu", 'skill' => ['Laravel', 'AWS'] ], [ 'name' => "Nanasi3", 'skill' => ['LINE', '5ch'] ], ]; $contents = []; foreach ($users as $user) { $contents[] = $user; } $users = $contents; $users = json_encode($users); var_dump($users);
一旦空の配列に入れて復元するよ
結果
[ { "name": "Yuu", "skill": [ "Laravel", "AWS" ] }, { "name": "Nanasi3", "skill": [ "LINE", "5ch" ] } ]
戻ったね。
この理解が大切。
参照渡しを使わないで加工するパターン
<?php $users = [ [ 'name' => "Yuu", 'skill' => ['Laravel', 'AWS'] ], [ 'name' => "Nanasi3", 'skill' => ['LINE', '5ch'] ], ]; foreach ($users as $key => $user) { $users[$key]['enable'] = true; } $users = json_encode($users); var_dump($users);
結果はもちろん同じだよ
[ { "name": "Yuu", "skill": [ "Laravel", "AWS" ], "enable": true }, { "name": "Nanasi3", "skill": [ "LINE", "5ch" ], "enable": true } ]
参照渡しを利用して加工するよ
<?php $users = [ [ 'name' => "Yuu", 'skill' => ['Laravel', 'AWS'] ], [ 'name' => "Nanasi3", 'skill' => ['LINE', '5ch'] ], ]; foreach ($users as &$user) { $user['enable'] = true; } $users = json_encode($users); var_dump($users);
引数が&$userになっている。enableプロパティを入れるよ
結果
[ { "name": "Yuu", "skill": [ "Laravel", "AWS" ], "enable": true }, { "name": "Nanasi3", "skill": [ "LINE", "5ch" ], "enable": true } ]
enableプロパティが追加できたね