php5.4にしたら参照渡しが……

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
今回は良くない

おまとめ三行

Call-time pass-by-reference has been removed
Only variables should be passed by reference
Cannot pass parameter 1 by reference in

PHPのバージョンを5.3から5.4にしたら、何かこんなエラーが出たんですよ。

Call-time pass-by-reference has been removed

Only variables should be passed by reference

これ、どちらも参照渡しに関するエラーのようなんです。調べてみたところ、5.4では、参照渡し自体がなくなったわけでなないようなんですが、特定の場合の書き方ができなくなってた。全然気がつきませんでした。



Call-time pass-by-reference has been removed

こっちは関数を呼び出すときに引数に「&」を入れてたらエラーが出ました。

//OKパターン
$n = 1;
sample($n);

function sample(&$n) {
  $n *= 2;
}

//NGパターン
$n = 1;
sample(&$n);

function sample($n) {
  $n *= 2;
}

上記のように関数を定義してる方で引数に「&」を入れる分には問題ないのですが、それを呼び出す方で「&」を書くとエラーになってしまうようです。



Only variables should be passed by reference

これは簡単に言えば、参照渡しには変数しか使えまへんでって感じのエラーです。

PHPの関数には引数が参照渡しになってるものとそうでないものがあって、参照渡しになってる関数の引数に直接配列とか値を入れてしまうと、エラーになるっぽいです。

えーと、どういうことかってーと、例えば配列の先頭の要素を取り除く「array_shift()」という関数があります。あれはどうやら第一引数が参照渡しになってるみたいで、直接配列を入れるとエラーが出ます。配列じゃなくて普通の文字列でも同じ。

//OKパターン
$a = array(1,2,3,4,5);
$r = array_shift($a);

//NGパターン
$r = array_shift(array(1,2,3,4,5));

こういう感じですね。一方、参照渡しになってなければ問題ないので、「implode()」なんかは、引数に直接配列を入れても特にエラーは出ませんでした。

$r = implode(',', array(1,2,3,4,5));

どれが参照渡しでどれがそうでないかってのはよく分かんないんですけど……うーん、実際にやってみて確かめるのが早いのかな。まあ、この手のエラーを出したくないんであれば、常に引数には変数を渡すようにしとけば良いと思います。



Cannot pass parameter 1 by reference in

ちょいとおまけ。

試しに自分で適当な関数(参照渡しあり)を作って引数に文字列を直接入れてみたら「Cannot pass 〜」とかいう、微妙に違う内容のエラーが出ました。

sample(1);

function sample(&$n) {
  $n *= 2;
}

でもまあ、これもようは参照渡しには変数入れろってことなんでしょう。






細かいことではありますが、でもそのまま放置ってわけにもいかないですからね。WarningエラーじゃなくてFatalエラーですしね、これ。PHPのバージョンを上げた時に急にサイトが動かなっちゃいます。

でも何でこうなったんだろうね? 別に「array_shift(array(1,2,3,4,5))」みたいな書き方を認めてくれても良いような気はするんだけど……コードの行数も減るし。

まあ、何か理由があるんだろうね。こっちの方が良い理由が。機会があれば、その辺も探ってみますかね。こういうときに「機会があれば」とか「いずれそのうち」とか言っちゃった場合、たぶんその時は永遠に訪れないけどね(笑)

まだコメントはいただけてないみたい……
もしかしたら何か関連しているかも?