回答:
関数の定義では、実際の呼び出しではなく、参照によって呼び出しを示す必要があります。PHPはバージョン5.3で非推奨のエラーを表示し始めたので、コードを書き直すことをお勧めします。
関数呼び出しには参照記号がなく、関数定義にのみあります。関数定義だけで、参照によって引数を正しく渡すのに十分です。PHP 5.3.0の時点で、あなたが使用する場合、「コール・タイム・参照渡し」が廃止されていることを言って警告を取得します
&
ではfoo(&$a);
。
たとえば、次を使用する代わりに:
// Wrong way!
myFunc(&$arg); # Deprecated pass-by-reference argument
function myFunc($arg) { }
使用する:
// Right way!
myFunc($var); # pass-by-value argument
function myFunc(&$arg) { }
私のように、巨大なレガシープロジェクトを5.6に更新する必要があるため、これを読んだ人のために:ここでの答えが指摘するように、迅速な修正はありません:問題の発生を手動で見つけて修正する必要があります。
プロジェクト内のすべての問題のある行を見つけるために見つけた最も便利な方法(本格的な静的コードアナライザーを使用する以外は、これは非常に正確ですが、エディターの正しい位置にすぐに移動する方法はわかりません) Visual Studio Codeを使用していました。これは、組み込みの素晴らしいPHPリンターと、正規表現による検索を可能にする検索機能を備えています。(もちろん、PHP lintingとRegex検索を実行するIDE /コードエディターを使用できます。)
この正規表現を使用する:
^(?!.*function).*(\&\$)
&$
関数定義ではない行のみの出現をプロジェクト全体で検索できます。
これは依然として多くの誤検知を引き起こしますが、それは仕事をより簡単にします。
VSCodeの検索結果ブラウザを使用すると、問題のある行をウォークスルーして見つけるのが非常に簡単になります。各結果をクリックするだけで、リンターが赤の下線を引いている行を探します。修正が必要なもの。
(?<!function)[:> ][a-zA-Z0-9_]+(?<!foreach|array)\s?\([^()]*&\$
PHPとリファレンスはやや直感的ではありません。適切な場所で適切に参照を使用すると、パフォーマンスが大幅に向上するか、非常に醜い回避策や異常なコードを回避できます。
次の場合、エラーが発生します。
function f(&$v){$v = true;}
f(&$v);
function f($v){$v = true;}
f(&$v);
これらは以下のルールに従うことができるので失敗する必要はありませんが、多くのレガシーの混乱を防ぐために削除または無効化されていることは間違いありません。
それらが機能した場合、どちらも参照への冗長な変換を含み、2番目はスコープ指定された包含変数への冗長な変換も含みます。
2つ目は、参照を処理することを目的としていないコードに参照を渡すことを可能にするために使用されていました。これは、保守性のために非常に醜いです。
これは何もしません:
function f($v){$v = true;}
$r = &$v;
f($r);
具体的には、参照を要求していないため、参照を通常の変数に戻します。
これは動作します:
function f(&$v){$v = true;}
f($v);
これは、非参照を渡しているが参照が必要であることを示しているため、参照に変換します。
これが意味することは、参照が明示的に要求されていない関数に参照を渡すことができないということです。これは、PHPが型の受け渡しに厳密である数少ない領域の1つにすることです。
より動的な動作が必要な場合、これは機能します。
function f(&$v){$v = true;}
$v = array(false,false,false);
$r = &$v[1];
f($r);
ここでは、参照が必要であり、すでに参照があるため、そのままにしておきます。それは参照を連鎖させるかもしれませんが、私はこれを疑います。