関数仕様編 その10(参照について その7)
- 編集部の見解や意向と異なる内容の場合があります
- 編集部は内容について正確性を保証できません
- 画像が表示されない場合、編集部では対応できません
- 内容の追加・修正も編集部では対応できません
ヒューマンリソシア株式会社はコラム「関数仕様編 その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/column/1604/
ソーシャルもやってます!