&をたくさん使って参照渡しをしているコードを見ています。
参照渡しをした方がいいのか、値渡しにしてメソッドに結果値を返させるのではどちらが良いかということを考えてみたいと思います。
PHPの仕様
- 配列は値
- デフォルトは値渡し
- パラメータに&を付けると参照渡しができる
参照渡しと値渡しのメリット・デメリット
参照渡し
- javaやC++の参照渡しと同じ感覚でコーディングできる
- &を書き忘れると呼び出しではデータが変わらない、またそれに気が付きにくい
値渡し
-
&
を書き忘れるというヒューマンエラーが起きない - 返却される値を見ればいいので、デバッグが楽
- 必ず値を返さなければならない
観点
ここで注目したいのが、値渡しとしてメソッドを定義すれば&
を書き忘れるというヒューマンエラーが起きないということです。
先日リファクタリングをしていてメソッドの抽出を行った際、&
を付け忘れてしまって配列の値が正しくないことに数日気がつかないということがありました。
その配列は4つのクラスをまたいでおり、どこで値がおかしくなっているのかをデバッグするのに大変時間がかかりました。
まとめ
配列を引数に渡すメソッドを定義するときに、参照渡しか値渡しにするべきか迷ったら「値渡し」を選択した方がいいと思います。