ホームページ  >  記事  >  バックエンド開発  >  PHP オブジェクト参照とオブジェクト最適化戦略

PHP オブジェクト参照とオブジェクト最適化戦略

高洛峰
高洛峰オリジナル
2016-10-17 11:12:101177ブラウズ

オブジェクト指向の考え方が PHP5 に登場すると、PHP プログラムを構築する際、オブジェクトの特性をクラスにカプセル化する際、特に PHP フレームワークを実際のプロジェクトに適用し、クラス オブジェクトを構築してクラスを呼び出す際に、プログラムの新しい概要が得られました。オブジェクトは次のように見えます。非常に特別であること。

私たちがプログラムを書くとき、オブジェクトが初めて構築される限り、その後の操作はオブジェクトに対して直接他の操作を実行することを期待していることがよくありますが、実際には、すべてのクラスがそれを実現できます。オブジェクトによるメソッドまたはプロパティの呼び出し。これは最も基本的なオブジェクト指向のアプローチです。しかし、いくつかのフレームワーク コレクションを研究すると、特に MVC モードのフレームワーク開発プログラムに適用した場合、コントローラー内に多くのアクション (コントローラー内の多くのメソッドと呼ばれるもの) があることがわかります。コントローラーがトランザクション オブジェクトの操作を制御する場合、オブジェクトの構築とデータ収集の操作に多くのアクションが発生することがわかりますが、毎回 NEW メソッドに依存してオブジェクトを構築すると、この時間は間違いなく自分のメモリ領域への負担を増加させます。新しいオブジェクトを構築するということは、間違いなくそれに新しいメモリ空間を割り当てることを意味しますが、実際に同じオブジェクトのアクションの継続だけが必要な場合は、すでに構築されたオブジェクトを見つけてそれを呼び出すことは間違いなく非常に良い考えです。同じオブジェクトのいわゆるアクションの継続は、実際には説明が簡単です。たとえば、データ モデル A の追加や削除などの操作を含むコントローラー クラスをコントローラー A として構築すると、コントロール アクションは存在します。慣例によれば、通常はフレームセットのシングル ポイント エントリ原則を使用して、ルート ディストリビュータ プログラムを通じてコン​​トローラ A を見つけますが、actionAdd または actionDelete への呼び出しが個別に行われ、両方のアクションが実行されます。モデル A でのデータ操作の場合、各操作は規則に従ってデータ オブジェクトを構築し、次に SQL を呼び出してデータベース操作を実行する必要があります。同じデータ オブジェクトを操作する 2 つのアクションを構築するときに、呼び出されるメソッドは同じメソッドを使用すると仮定します。ステートメント $a=new A() の形式では、2 つの操作で実際に 2 つのオブジェクトが生成され、同時に 2 倍のメモリ領域を占有します。これは、同じ人に 2 つのアクションの実行を要求しているだけだと想像してください。 2 つの操作が必要ですか? この状況では明らかにリソースの無駄であり、アクションが多すぎると大量のオブジェクト リソースがメモリを占有し、システムのパフォーマンスが大幅に低下します。そして最終的には重大な事故につながります。

実際、私たちが多くのプログラムを書くとき、機能を完成させるためのテクノロジーは、優れたプログラムやウェブサイトにとって最も基本的な部分にすぎず、研究する必要があるのは機能的な問題だけではなく、もっと重要であることを繰り返し強調してきました。全体的なパフォーマンス、特に大規模なユーティリティ プログラムではパフォーマンスが非常に重要です。フレーム コレクションは、アドレス参照を適切に使用することに優れているため、この良い例です。何かが 1 つのオブジェクトで処理できる場合は、1 つのオブジェクトで処理させて、異なるカテゴリの他のオブジェクト用に十分なスペースを残します。

フレームワーク コレクションがオブジェクト リソースが再利用されているかどうかを解決するための最良の方法は、オブジェクトが存在するとき、通常は最初に作成されるときに、それをグローバル変数にロードすることです。将来そのオブジェクトのメソッドを呼び出すことを検討するときは、このクラスのオブジェクトがグローバル変数にあるかどうかを直接確認できます。つまり、オブジェクトが登録されているかどうかを確認できます。存在する場合は、そのオブジェクトを直接返します。このクラスを作成し、参照用のアドレスを通知します。このようにして、オブジェクトのアドレス参照を簡単に実装できます。すべてのオブジェクト変数が同じメモリ空間を指すように作成された場合、現時点では名前が異なるだけであると言いますが、実際には同じオブジェクトです。

したがって、そのようなプログラム コードは次のように作成できます:

<?php
$GLOBALS[&#39;objects&#39;][&#39;classname&#39;]=null; //是否注册类,类名变量
$GLOBALS[&#39;objects&#39;][&#39;obj&#39;]=null; //对象变量
function & getSingle($classname){
if($GLOBALS[&#39;objects&#39;][&#39;classname&#39;]==$classname){
return $GLOBALS[&#39;objects&#39;][&#39;obj&#39;];
}else
{
$object= new $classname();
$GLOBALS[&#39;objects&#39;][&#39;classname&#39;]=$classname;
$GLOBALS[&#39;objects&#39;][&#39;obj&#39;]=&$object;
return $GLOBALS[&#39;objects&#39;][&#39;obj&#39;];
}
}
class Test{
var $p1;
function Test(){
$this->p1=1;
}
function add()
{
$this->p1++;
}
function show()
{
return $this->p1;
}
}
$test1=&getSingle(&#39;Test&#39;);
$test1->add();
$test2=&getSingle(&#39;Test&#39;);
echo $test2->show();
$test2->add();
$test3=&getSingle(&#39;Test&#39;);
echo $test3->show();
if($test1===$test2)
echo &#39;yes&#39;;
else
echo &#39;no&#39;;
?>

事実によると、オブジェクトが初めて作成された後、データを読み取るための 2 回目の呼び出しは元のオブジェクトに基づく必要があり、これは次のようになります。 $test2 がデータを削除すると、結果は 2 になり、追加操作が実行された後、$test3 が再度読み取ると、結果は 3 になることがわかります。これは明らかに完了によるものです。アクション2の。このことから、ステップバイステップの操作に同じオブジェクトを使用する利点がわかります。これは、フレームワークを使用するときに、上記のコードを置き換えるという状況が頻繁に発生するためです。 $test1、$test2、$test3 とそれらのアクションは、同じコントローラーの異なるアクションに配置されます。アクション ブロックは互いに独立しているため、3 つのオブジェクト変数のどれが最初にトリガーされ、誰が最初にオブジェクト変数を作成するかが決まります。オブジェクトのメモリ空間はランダムに決定されます。 1回目はオブジェクトがグローバル変数に登録されているかどうかを確認し、その後オブジェクトのアドレスがグローバル変数に格納されているかどうかを確認してアクセスします。


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