特集・コラム

メニュー

PHPer上級者になるために知っておきたいこと

vol.38 ‐ PHP『関数仕様編 その3』

投稿日時:2014/06/12 01:06

カテゴリ: PHPer上級者になるために知っておきたいこと

引数関連最後の話題は「参照渡し」について、でございます。
ちなみに現在、PHPのマニュアルでは「リファレンス渡し」と書いてありますので、
出来るだけそちらの翻訳にあわせていきます。
まずは簡単に「リファレンス渡し」そのものについて説明をした後、
そこにまつわる諸々を少し、確認していきたいと思います。

ごく簡単なコードからゆっくりと「リファレンス渡し」について紐解いていきましょう。

function hoge($i) {
$i += 10;
}
//
$i = 1;
hoge($i);
var_dump($i);

このプログラムで、var_dumpの結果が「int(1)」であるのはよろしいかと思います。
引数で渡した値を変更しても、元の変数には関わりが出てこないので。
んでもって、リファレンス渡しにすると、このように変わります。

function hoge(&$i) {
$i += 10;
}
//
$i = 1;
hoge($i);
var_dump($i);

引数の値を変えた時に「元の変数の値も変わる」のが、リファレンス渡しの基本になります。

function hoge(&$i) {
$i .= ‘ss';
}
//
$i = 1;
hoge($i);
var_dump($i);

なんてことをやると分かるのですが「型を変えちゃえば元の変数のほうの型も変わっちゃう」ので、
便利かもしれませんし注意が必要かもしれません。
さて…まずは小手先に近いところから、いくつか。
まず「リファレンス渡し」にした関数に「定数」を渡すと、エラーになりますので注意が必要です。

function hoge($i) {
$i += 10;
}
//
hoge(1);

は「エラーが起きない」という意味合いにおいて無問題ですが、

function hoge(&$i) {
$i += 10;
}
//
hoge(1);

は「Fatal error: Only variables can be passed by reference」というエラーになりますので、宜しくありません。
このあたりは「参照について」理解していくと分かるのですが…それは後ほど、項を改めてお送りいたします。

また、リファレンス渡しは「関数宣言に」のみ使います。
んと…NGなパターンを、二つほど。どちらも「引数の側で&を付けている」やり方、になります。

function hoge($i) {
$i += 10;
}
//
$i = 1;
hoge(&$i);
var_dump($i);

function hoge(&$i) {
$i += 10;
}
//
$i = 1;
hoge(&$i);
var_dump($i);

これらは、エラーメッセージ「Fatal error: Call-time pass-by-reference has been removed 」にも書いてある通り、Call-time pass-by-referenceといって、5.3.0以降で警告が、5.4.0以降ではfatal エラーが発生します(実行環境は5.5でしたので、がっつりとエラーです)。
ちなみに「昔は」OKでした。
ですので、古いコードで「使われている事がある」手法なので、特に「古いコード」を持ってくる時などに、
注意を払っておくとよいでしょう。

さて…少し、踏み込んで行きます。

class hoge {
}
function foo(&$obj) {
$obj->test_ = 10;
}
//
$o = new hoge();
foo($o);
var_dump($o);

こちらの結果が
object(hoge)#1 (1) {
[“test_”]=>
int(10)
}
になるのはよろしいかと思うのですが。

class hoge {
}
function foo($obj) {
$obj->test_ = 10;
}
//
$o = new hoge();
foo($o);
var_dump($o);

も、同じように
object(hoge)#1 (1) {
[“test_”]=>
int(10)
}
になります…はて? リファレンス渡しにはしていないはずなのですが?

この辺りから、ゆっくりと「濃い」領域に踏み込んでいく事になります。
参照、リファレンス、ポインタといった「比較的、忌避されやすい概念」の説明になりますが、重要なところですので。
ちょいと次回以降、ガッツリと踏み込んでみたいと思います。

バックナンバーはこちら

IT系のお仕事特集

お仕事のご紹介には、まずヒューマンリソシアへの登録が必要です。
ヒューマンリソシア人材派遣サイトの便利な機能 ・お気に入りの派遣求人のブックマーク ・登録会への予約 ・有給休暇の管理 ・WEB給与明細の確認 ・お気に入りの情報をメール受信
登録会の入力手続きをあらかじめおこなえます。

ヒューマンリソシア派遣サービスに 登録する 無料

ページトップへ戻る
ヒューマンリソシア派遣サービスに 登録する 無料
ページトップへ戻る