logo

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

コラム「PHPer上級者になるために知っておきたいこと」

ヒューマンリソシア株式会社はPHP技術者認定機構の上級試験を題材とした古庄親方の コラム「PHPer上級者になるために知っておきたいこと」のvol.45 ‐ 『関数仕様編 その10(参照について その7)』を公開しました。

###

長らくの参照ネタですが、ようやくのフィナーレとなります。
さて…改めて、コラム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関数で呼び出す関数は、
リファレンス渡しをしない関数にする」というのを覚えておくとよいでしょう。

(この続きはこちらから)
リンク

このプレスリリースの付帯情報

(画像をクリックすると拡大画像をご覧いただけます。)

関連情報
http://resocia.jp/
本プレスリリースは発表元企業よりご投稿いただいた情報を掲載しております。
お問い合わせにつきましては発表元企業までお願いいたします。

今日の主要記事