0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

phpの参照渡し(リファレンス渡し)を使ってみる

Last updated at Posted at 2024-10-24

参照渡しは非推奨のようです。コメントに詳細付けてもらったのでそちらをご確認ください。

概要

公式マニュアルには以下のように記載がされています。
リファレンス渡し
リファレンスにより関数に変数を渡すことが可能です。この場合、関数内で その引数を修正可能になります。構文は次のようになります。
マニュアル内では関数での利用法について記載がありますが、私が使用したforeach内での活用方法について記載します。

活用方法

共有する関数内で生成されたオブジェクトにおいて、一部の要素が不要といった状況が発生しました。

オブジェクトの特性

・親キーがランダムである
・削除対象の子キーが同一である

上記に倣ったオブジェクトの例

$data = [
    '123456' => [
        'aaa' => [...],
        'bbb' => [...],
        'ccc' => [...]
    ],
    '446913' => [
        'aaa' => [...],
        'bbb' => [...],
        'ccc' => [...]
    ],
    '84351654' => [
        'aaa' => [...],
        'bbb' => [...],
        'ccc' => [...]
    ],
];

cccのキーを持つオブジェクトを$dataから削除をしたいとき、以下の様にforeachで回します。

foreach($data as &$trim_data){
    //親キー='ccc'のオブジェクトを削除
    unset($trim_data['ccc']);
}
unset($trim_data);
var_dump($data);

出力結果

array(3) {
  ["123456"]=>
  array(3) {
    ["aaa"]=>
    ...
    ["bbb"]=>
    ...
  }
  ["446913"]=>
  array(3) {
    ["aaa"]=>
    ...
    ["bbb"]=>
    ...
  }
  ["84351654"]=>
  array(3) {
    ["aaa"]=>
    ...
    ["bbb"]=>
    ...
  }
}

まとめ

関数内で変数を参照渡しを利用して操作する場合、その変更はすべての呼び出し元に作用します。
参照渡しを使用することで、関数内での変更が直接呼び出し元の変数に影響を与えることになります。
これにより、変更を意図的に呼び出し元に反映させたい場合に便利です。

一方で、参照渡しを使わない場合は、関数内での操作が呼び出し元に影響を与えません。これにより、呼び出し元の変数を安全に操作することができると思い記事にしてみました。

こっちのがいいよみたいのがあればぜひコメントで教えてください!

参考

php公式マニュアル
0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?