ホームページ >バックエンド開発 >PHPチュートリアル >PHP_PHP チュートリアルでシンボルを参照するときに注意すべきいくつかの問題について説明します
多くの人が、php の参照が C のポインタと同じであると誤解しています。実際には、それらは異なり、大きく異なります。 C 言語のポインタは配列転送プロセス中に明示的に宣言する必要はなく、その他の点は * を使用して定義する必要があります。ただし、PHP のアドレスへのポインタ (ポインタと同様) 関数はユーザー自身が実装するものではありません。ただし、Zend コアによって実装されています。はい、PHP リファレンスとシンボルは「コピーオンライト」の原則を採用しています。つまり、書き込み操作が発生しない限り、同じアドレスを指す変数やオブジェクトはコピーされません。次のコードのように:
<ol class="dp-xml"> <li class="alt"><span><span>$</span><span class="attribute"><font color="#ff0000">a</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">array</font></span><span>('a','c'...'n'); </span></span></li> <li class=""> <span>$</span><span class="attribute"><font color="#ff0000">b</font></span><span> = $a; </span> </li> </ol>
プログラムがここでのみ実行される場合、$b と $b は同じですが、C のように異なるメモリ空間を占有しませんが、$a と $b はポイントしますこれは php と $b です。c の違いは、$b が $a のメモリを指すように記述する必要がないことです。 zend は、いつこれを行うべきか、また、これはどのように処理すべきではないかを判断するのに非常に賢明です。
後で次のコードを書き続ける場合は、関数を追加し、PHP で & 記号を使用してパラメーターを渡し、配列のサイズを出力します。
<ol class="dp-xml"> <li class="alt"><span><span>function printArray(&$arr) //引用传递 </span></span></li> <li class=""><span> { </span></li> <li class="alt"><span> print(count($arr)); </span></li> <li class=""><span> } </span></li> <li class="alt"><span> </span></li> <li class=""><span> printArray($a); </span></li> </ol>上記のコードでは、PHP リファレンスとシンボルを介して $a 配列を printArray() 関数に渡します。zend エンジンは、printArray() によって $a が変更される可能性があると考えます。今度は、$a のデータ コピーが $b 用に自動的に作成され、メモリの一部がストレージに再適用されます。これが、前述した「コピーオンライト」の概念です。 上記のコードを次のように変更すると:
<ol class="dp-xml"> <li class="alt"><span><span>function printArray($arr) //值传递 </span></span></li> <li class=""><span> { </span></li> <li class="alt"><span> print(count($arr)); </span></li> <li class=""><span> } </span></li> <li class="alt"><span> </span></li> <li class=""><span> printArray($a); </span></li> </ol>
上記のコードは、現時点では $a 値を printArray() に直接渡します。コピーオンライトは発生しません。