7/24
引数の参照渡し - PHP
基本的な事なんだと思うけど参照渡しができるとは知らんかった。
引数に&引数名と指定するだけだった。ちなみに変数でも使えるようです。
$a = 10;
hoge($a);
function hoge(&$item){
$item = 20;
}
echo $a;
簡単に言うと参照渡しは引数に変数そのものを渡している感じで、&を付加しない場合の値渡しは変数にセットした値のみを引数に渡していると考えるとよいかもしれません。
詳しくは他のサイトを参考にしてください。
上記のコードの実行結果は20となります。
なぜこれに辿り着いたかというと、あるデータのチェック処理を行っていたんです。
例ですが以下のようなコードです。
$ary = array();
$ary["name"] = "nashiko";
$ary["url"] = "nashiko.net";
if(isset($ary["blog"])){
echo "aru";
}
else{
echo "nai";
}
これの結果はnaiと表示されるはずです。
ちなみにissetは変数がセットされているか確認できる関数です。
どうせならと思いisset以外の処理も一気にチェックできるような共通関数を作ろうとしたときに困った事になったんです。
<?php
$ary = array();
$ary["name"] = "nashiko";
$ary["url"] = "nashiko.net";
echo isDefErr($ary["blog"]);
function isDefErr($str){
if( ! isset($str) ){
return "エラー1番目";
}
if( $str == "" ){
return "エラー2番目";
}
return "エラーなし";
}
?>
分かりやすくreturnで文字列を返してます。
このコードを実行させると6行目でNoticeが表示されます。引数に存在しない$ary["blog"]のデータを渡そうとしているからです。よくよく考えればあたりまえの事です。
そこで参照渡しの出番です。
引数の$strを&$strに変更し実行すればNoticeがでなくなります。
たったこれだけの事だったんですが、なかなか思いつかなくハマってしまいました。
echo isDefErr($ary["blog"]);
の前に
$ary["blog"] = "ヤッチマイナシコ";
を追加すれば「エラーなし」と表示されます。
<?php
$ary = array();
$ary["name"] = "nashiko";
$ary["url"] = "nashiko.net";
$ary["blog"] = "ヤッチマイナシコ";
echo isDefErr(&$ary["blog"]);
function isDefErr($str){
if( !isset($str) ){
return "エラー1番目";
}
if( $str == "" ){
return "エラー2番目";
}
return "エラーなし";
}
?>


