多くの人が、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>
<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() に直接渡します。コピーオンライトは発生しません。