$a="EFG";
?>
$a と $b が指すメモリ内のデータを書き換える必要があるため、この時点で Zend コアは $a の $b 用のデータ コピーを自動的に決定して自動的に生成し、再書き込みします。 - ストレージ用のメモリの一部を申請する
PHP 参照 (つまり、変数、関数、オブジェクトなどの前にアンパサンドを追加すること) は、初心者には有料のトピックです。 PHP 参照を正しく理解することが重要です。これはパフォーマンスに大きな影響を及ぼし、誤解がプログラム エラーにつながる可能性があります。
多くの人は、PHP の参照が C のポインターと同じであると誤解しています。実際には、それらは異なり、大きく異なります。配列転送処理中に明示的に宣言する必要のない C 言語のポインタを除き、その他のポイントは * を使用して定義する必要があります。ただし、PHP では (ポインタと同様の) アドレスを指す機能が実装されていません。はい、PHP の参照は「コピーオンライト」の原則を採用しています。つまり、書き込み操作が発生しない限り、同じアドレスを指す変数やオブジェクトはコピーされません。例: 次のコード:
$a = array('a','c'...'n');
$b = $a ;
プログラムがここまでのみ実行する場合、$a と $b は同じですが、C のように異なるメモリ空間を占有することはなく、同じメモリを指します。 php と c の違いは、$ b=&$a と書く必要はありません。これは、$b が $a のメモリを指していることを意味します。zend は、いつ実装すべきかを非常に賢明に支援します。このように扱われる必要がある場合と、このように扱われるべきではない場合。
後で次のコードを書き続ける場合は、関数を追加し、パラメーターを参照渡しして、配列のサイズを出力します。
function printArray(&$arr) // 参照渡し
{
print(count($arr));
}
printArray($a);
上記のコードでは、$a 配列を参照によって printArray() 関数に渡します。zend エンジンは、printArray() が原因でエラーが発生すると考えます。 $a でエラーが発生しました。この時点で、$a のデータ コピーが $b 用に自動的に作成され、メモリの一部がストレージに再適用されます。これが、前述した「コピーオンライト」の概念です。
上記のコードを次のように変更すると:
function printArray($arr) // 値の転送
{
print ( count($arr));
}
printArray($a);
上記のコードは $a 値を printArray() に直接渡します。現時点では参照転送がないため、コピーオンライトは行われません。
上記の 2 行のコードの実行効率をテストできます。たとえば、ループを 1000 回外に追加して、実行にかかる時間を確認します。その結果、参照が不適切に使用された場合に影響を受けることがわかります。パフォーマンスが 30% 以上低下する原因となります。
自己理解: 値渡しの場合は関数内の引数とは無関係でローカル変数の役割に相当しますが、アドレス(参照)渡しの場合は関数内のパラメータに関係します。関数内のパラメータ。グローバル変数の役割に相当します。パフォーマンスの観点からは、上記の分析を見るだけで十分です。 .