友人が以前の投稿でこの質問について言及しましたが、PHP を初めて使用するより多くの友人を助けることを願って、ここで簡単に要約します。
PHP 参照 (つまり、変数、関数、オブジェクトなどの前にアンパサンドを追加する) は高度なトピックであり、PHP 参照を正しく理解することが重要です。パフォーマンスへの影響、およびエラーがプログラム エラーにつながる可能性があることを理解する必要があります。
多くの人は、PHP の参照が C のポインターと同じであると誤解しています。実際には、それらは異なり、大きく異なります。配列転送プロセス中に明示的に宣言する必要のない C 言語のポインターを除き、他のポイントは * を使用して定義する必要があります。ただし、PHP のアドレスへのポインター (ポインターと同様) 関数は、はい、PHP の参照は「コピーオンライト」の原則を採用しています。つまり、書き込み操作が発生しない限り、同じアドレスを指す変数やオブジェクトはコピーされません。たとえば、次のコード:
$a = array('a','c'...'n');
$b = $a;
Ifプログラムはここでのみ実行されます。$b と $b は同じですが、C とは異なり、$a と $b は異なるメモリ空間を占有しますが、これが php と c の違いです。 $b=&$a と書かれているのは、$b が $a を指していることを意味します。zend はすでに参照を実装しており、zend は、いつこの方法で処理すべきか、いつ処理すべきでないかを判断するのに非常に賢明です。このようにして。
後で次のコードを書き続ける場合は、関数を追加し、パラメーターを参照渡しして、配列のサイズを出力します。
function printArray(&$arr) // 参照渡し
{
print(count($arr));
}
printArray($a);
上記のコードでは、$a 配列を参照によって printArray() 関数に渡します。zend エンジンは、printArray() によって $a が変更される可能性があると判断し、$b に対して $a を自動的に生成します。データをコピーし、ストレージ用のメモリを再申請します。これが、前述した「コピーオンライト」の概念です。
上記のコードを次のように変更すると:
function printArray($arr) //値転送
{
print(count($arr));
}
} printArray($a);
上記のコードは、$a 値を printArray() に直接渡します。このため、コピーオンライトは行われません。 。
上記の 2 行のコードの実行効率をテストできます。たとえば、ループを 1000 回外に追加して、実行にかかる時間を確認します。その結果、参照の使用が間違っていることがわかります。パフォーマンスが 30% 以上低下する原因となります。