オルタナティブ・ブログ > 吉政忠志のベンチャービジネス千里眼 >

IT業界でベンチャービジネスの支援をしている執筆者が日々の活動ログと感じたことを、徒然なるままに書き綴っていきます。

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

»

私が主宰している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/column/1604/

Comment(0)