- Japan Edition
- ZDNet is available in the following editions:
- Austrailia
- Asia
- China
- France
- Germany
- United Kingdom
- USA
- Blog
- ホワイトペーパー
- 企業情報センター
- アメリカ発
- builder by ZDNet Japan
- CNET Japan
- TechRepublic Japan
コラム「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関数で呼び出す関数は、
リファレンス渡しをしない関数にする」というのを覚えておくとよいでしょう。
(この続きはこちらから)
(リンク »)
御社の企業情報・プレスリリース・イベント情報・製品情報などを登録するには、企業情報センターサービスへのお申し込みをいただく必要がございます。詳しくは以下のページをご覧ください。
ZDNet Japanは、CIOとITマネージャーを対象に、ビジネス課題の解決とITを活用した新たな価値創造を支援します。
ITビジネス全般については、CNET Japanをご覧ください。