勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ

PHPで引数の先頭に&(アンパサンド)をつける参照渡し(リファレンス渡し)について

  PHP

他社が作成されたPHPのソースコードを拝見していると関数の引数の頭に&(アンパサンド)が付いていた。何の意味があるのか分からなかったので調べたところ参照渡し(リファレンス渡し)というらしく、通常の値渡しとは挙動が異なるみたい。以下に詳細をメモ。

 

リファレンス

https://www.php.net/manual/ja/language.references.pass.php

上記リファレンスによると以下の部分が通常の値渡しとは異なる模様。

リファレンスにより関数に変数を渡すことが可能です。この場合、関数内でその引数を修正可能になります。

また、リファレンス内の以下ソースコードが分かりやすい。

<?php
function foo(&$var)
{
    $var++;
}

$a=5;
foo($a);
// $a はここでは 6 です
?>

念のため以下に値渡しと参照渡しの比較となるソースコードを書く。

 

比較

値渡しの場合

function testFunc( $val ){
    return $val * 2;
}

$score = 100;
$score_test = testFunc($score);

var_dump($score); //int(100)
var_dump($score_test); //int(100)

参照渡しの場合

function testFunc( &$val ){
    return $val * 2;
}

$score = 100;
$score_test = testFunc($score);

var_dump($score); //int(100)
var_dump($score_test); //int(200)

testFunc($score)の部分で$scoreの値が書き換わっているという部分が異なる。

 

所感

使いどころは分からず

イマイチ使いどころが分からない上に、値が書き換わってしまうと問題が発生した際に内容を追いづらい気がする。

また、今のところ通常の値渡しで困ったということは無いので今後参照渡しを使うかと言われると微妙。

とりあえず引数の前に&(アンパサンド)がついていたら「これは参照渡しで当該関数を通った変数の値は書き換わっている可能性あり」と覚えておく。

リファレンスとマニュアルとドキュメント

PHP自体もしくは何らかのライブラリの説明書について「リファレンス」「マニュアル」「ドキュメント」と色々呼び方が違っており、もしかして意味も多少違っていたりするの? と思った。

「リファレンス」と「マニュアル」についてIT用語辞典によると以下の通りで意味的には説明書もしくは仕様書となり、ただの略称とのこと。

リファレンスマニュアル(reference manual)とは、製品に添付される文書の一種で、対象の機能や仕様などを網羅的に解説したもの。「マニュアル」を省略して単に「リファレンス」と呼ばれることが多い。

「ドキュメント」についてIT用語辞典によると資料的な意味になるようだけど、マニュアルやリファレンスも含まれるらしいので実質同じ意味として捉えておいても良さそう。

ドキュメント(document)とは、書類、資料、記録(物)、記録する、文書化する、立証する、などの意味を持つ英単語。ITの分野では文字や図表、写真などを組み合わせて作成された文書や、文書としての形式や体裁を持つデータやファイルなどのことをドキュメントという。

 - PHP

  関連記事

PhpSpreadsheetで文字色の変更、太字化、セルの色の変更を行う方法
PhpSpreadsheetで文字色の変更、太字化、セルの色の変更を行う方法

以前PHPとPhpSpreadsheetを用いてExcelシートを出力する方法を ...

JSからJSON形式のデータをfetchで投げてPHPで受け取り、PHPから返してJSで受け取る方法
JSからJSON形式のデータをfetchで投げてPHPで受け取り、PHPから返してJSで受け取る方法

JavaScriptからPHPに対してJSON形式のデータをfetch通信でリク ...

PHPでLINEログイン後「ユーザー名」「ユーザーID」「プロフィール画像URL」「メッセージ」を取得する方法
PHPでLINEログイン後「ユーザー名」「ユーザーID」「プロフィール画像URL」「メッセージ」を取得する方法

<a>タグのリンクからページ遷移するとLINEログインし、その後に「 ...

PHPでお問い合わせ等のform構築時にCSRF対策を行う方法
PHPでお問い合わせ等のform構築時にCSRF対策を行う方法

他社が制作されたお問い合わせフォームを改修する案件があった。ソースコードを拝見し ...

PHPにてacebook / twitter / Googleアカウントでソーシャル(SNS)ログインする方法
PHPにてacebook / twitter / Googleアカウントでソーシャル(SNS)ログインする方法

PHPにて制作したシステムで「facebook / twitter / Goog ...