ホームページ > バックエンド開発 > PHPチュートリアル > PHP_PHP チュートリアルでシンボルを参照するときに注意すべきいくつかの問題について説明します

PHP_PHP チュートリアルでシンボルを参照するときに注意すべきいくつかの問題について説明します

WBOY
リリース: 2016-07-15 13:29:29
オリジナル
844 人が閲覧しました

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

上記の 2 行のコードの実行効率をテストできます。たとえば、ループを 1000 回外に追加して、実行にかかる時間を確認します。その結果、PHP 参照とシンボルを誤って使用すると、問題が発生することがわかります。パフォーマンスが 30% 以上低下する原因となります。


http://www.bkjia.com/PHPjc/446367.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/446367.html技術記事多くの人は、PHP の参照が C のポインターと同じであると誤解しています。実際には、それらは異なり、大きく異なります。 C 言語のポインターは配列転送プロセス中に明示的に宣言する必要がないという事実を除いて、その他...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート