読者です 読者をやめる 読者になる 読者になる

PHPのcall by reference

今日は外が嵐だったので半日Wikitccのソースを眺めていました。
あ、WikitccとはPHPで書かれた(遠い先輩の)お手製のWikiエンジンです。

PHPを触るのは(ほぼ)初めてだったのですが、意外とすんなり読めました。
公式リファレンスも充実してますね。カレー味だから許せるよねといった感じです。

で、PHPのバージョンアップで挙動がおかしくなっていた部分を直しました。

//generic.php, l135
return array_pop(explode(".", $path));

このコードがPHP5では "Strict Standards: Only variables should be passed by reference" と何やらワーニングのようなものを吐いていました。
array_popの仮引数が参照渡しを要求するにも関わらず値を直接渡しているのが原因です。
これを解決するには

$tmp=explode(".", $file);
return array_pop($tmp);

と一旦変数にいれてやるしかないらしいです。

この辺り、C++と似た気持ち悪さを感じます。

string huga(){
        return "hoge";
}
string hoge(string &a){
        return a;
}
hoge(huga()); //<-Error

ただ参照型と値が混在している、というだけなら他の言語、例えばC#Javaだってそうなのですが、この2つの言語では渡すのは""で統一されています。(参照型も参照の"値"渡し)

それに比べてPHP,C++では参照呼びと値呼びどちらもある、すなわち
関数を呼び出してる段階では引数がどちらで渡されるのかさっぱりわからない!
から混乱してしまうのでしょう。

そういえば今思い出したのだけれど、このプログラムの構造、zickさんが随分前に書いてたこれ
http://blog.bugyo.tk/lyrical/archives/861
と同じでした。
PHPはStrict Standards吐くだけで動くことは動くので、PHPはcall by referenceと呼べる かもしれない。