特集・コラム

メニュー

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

vol.45 ‐ PHP『関数仕様編 その10(参照について その7)』

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

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

長らくの参照ネタですが、ようやくのフィナーレとなります。
さて…改めて、コラム38で扱っていたお題を再度見てみましょう。

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

こちら、ですね。
値がスカラー値または配列の場合は、リファレンス渡しで渡すのか普通に渡すのかで、結果が変わってきます。
クラスインスタンスの場合、コラム42で解説をしたとおり「オブジェクトID、の値渡し」になるので、
結果的に、他言語でいうところの「参照渡し」と同じような状況が生まれます。
また、コラム41で見たとおりですが。速度については「あまり違わない(厳密には、リファレンス渡しのほうがむしろ重い)」のを合わせると、リファレンス渡しのメリットは、限定的な状況以外では、幾分、仕様をためらうなり検討しなおすなりしたほうが宜しいのではないか、とも思います。

さて…この「リファレンス渡し」でもう一つ、注意しておいたほうがよい事項がありますので、
説明をしていきましょう。
まずは、こちら。

function hoge(&$s) {
$s .= ‘ hoge add';
}
$s = ‘test';
hoge($s);
var_dump($s);

で、憂慮すべき状況なのが、こちら。

function hoge(&$s) {
$s .= ‘ hoge add';
}
$s = ‘test';
call_user_func(‘hoge’, $s);
var_dump($s);

こちらも同様。

function hoge(&$s) {
$s .= ‘ hoge add';
}
$s = ‘test';
call_user_func_array(‘hoge’, array($s));
var_dump($s);

いずれも、Warningの警告が出てくる上で、意図した通りの動きをしません。
これはある意味当たり前で。一度call_user_func関数で受け取っているタイミングで「リファレンスではなくて値渡し」で情報をもらっているので、リファレンス渡しのしようがないんですね。
一応回避策がなくもないのですが、基本的には「call_user_func関数やcall_user_func_array関数で呼び出す関数は、
リファレンス渡しをしない関数にする」というのを覚えておくとよいでしょう。

最後に、リファレンスは「戻り値」でも扱う事ができます。
記法について、まずは確認をしてみましょう。

function &hoge() {
$i = 100;
return $i;
}
$i =& hoge();
var_dump($i);

関数定義と代入式の両方で&を使う事で、リファレンスによる返り値を得る事ができます。
ただ、こちらも「性能が上がるだろう」という理由での利用は、PHPでは避けた方がよいです。
以下、検証のコードを。

function &hoge() {
$i = 100;
return $i;
}
function foo() {
$i = 100;
return $i;
}
//
$start = microtime(true);
for($i = 0; $i < 1000000; $i ++) {
$r =& hoge();
}
$middle = microtime(true);
for($i = 0; $i < 1000000; $i ++) {
$r = foo();
}
$end = microtime(true);
var_dump($middle – $start);
var_dump($end – $middle);

結果
float(0.75878095626831)
float(0.71559810638428)

百万回回してこの程度ですので「誤差」程度だとは思うのですが。
実際せいぜいが「誤差」ですし、厳密にはそれでも「リファレンスによる戻り値のほうが重い」という結果にもなりますので、よほどきちんとした別の理由がないかぎり、リファレンスによる戻り値、は、使わない方がよいと思われます。

さて。
長々と、引数とそれにまつわる参照のお話について、説明をさせていただきました。
難易度としてはかなり歯ごたえのある部類だったかと思いますが、如何でしょうか?

次回は、無名関数と匿名関数、という、新しい仕様について説明をしていければ、と思います。

バックナンバーはこちら

IT系のお仕事特集

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

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

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