ホームページ >php教程 >php手册 >動的 Web ページ PHP での参照の使用に関する注意事項

動的 Web ページ PHP での参照の使用に関する注意事項

WBOY
WBOYオリジナル
2016-06-21 09:00:551003ブラウズ

友人が以前の投稿でこの質問について言及しましたが、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% 以上低下する原因となります。



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。