ホームページ  >  記事  >  php教程  >  Yii フレームワーク分析 (5) - CComponent 基本クラスの話をもう一度しましょう

Yii フレームワーク分析 (5) - CComponent 基本クラスの話をもう一度しましょう

黄舟
黄舟オリジナル
2016-12-27 11:19:001115ブラウズ

この記事は「Yii フレームワーク分析 (2) - CComponent クラス分析」の補足として使用できます。

CComponent クラスは、YII フレームワークのコンポーネントベースおよびイベント駆動型プログラミングの基盤を提供します。YII フレームワークのほとんどのクラスは、CComponent クラスを基本クラスとして使用します。 CComponent クラスは、そのサブクラスに 3 つの機能を提供します:

1. メンバー変数の拡張
次のような 2 つのメンバー関数 (getXXX/setXXX) を定義してメンバー変数を定義します。
public function getText() {…}
public function setText { …}
これは、次のように呼び出すことができる $text メンバー変数を定義するのと同じです

$a=new CComponent;
$a=$component->text; // 等价于$a=$component->getText();
$component->text='abc'; // 等价于$component->setText('abc');

CComponent は、クラス自体が操作するときに、マジック メソッド __get および __set を通じて「メンバー変数拡張」機能を実装します。既存のメンバー変数を使用すると、PHP はこのクラスの __get メソッドと __set メソッドを呼び出して処理します。 CComponent は、これら 2 つのマジック メソッドを使用して「メンバー変数展開」機能を実装します。次の図は、2 つのメンバー変数 active と sessionName を追加する CComponent のサブクラスを示しています。この図は、これら 2 つのメンバー変数の呼び出しプロセスを示しています。

Yii フレームワーク分析 (5) - CComponent 基本クラスの話をもう一度しましょう

(注: マジックメソッド __get および __set の使用については、PHP 基本クラスとオブジェクト 13 - オーバーロードを参照してください)

オブジェクト指向プログラミングでは、メンバー変数を直接定義するだけですが、なぜ CComponent は2 つの関数を定義してメンバー変数を実装しますか?主な理由の 1 つは、メンバー変数の「読み込みを遅らせる」必要があることです。一般に、クラスのメンバー変数はコンストラクターまたは初期化関数で均一に割り当てられますが、Web リクエストの処理中にすべてのメンバー変数が割り当てられるわけではありません。たとえば、App クラスは 2 つのメンバー変数 $cache と $db ($cache はキャッシュ オブジェクト、$db はデータベース リンク オブジェクト) を定義します。これらの 2 つのオブジェクトは App クラスの初期化時に作成されますが、Web For Web サイト上の一部のページでは、コンテンツをキャッシュを通じて取得できるため、データベース リンク オブジェクトを実際に作成する必要はありません。 App が CComponent のサブクラスとして定義されている場合、App クラスに getCache/getDb という 2 つのメソッドが定義されているため、db メンバー変数が初めて使用されるときに getDb 関数が呼び出され、データベース リンクが初期化されます。 - つまり、最初の使用時に初期化します。遅延読み込みにより関数呼び出しが 1 つ追加されますが、メンバー変数の不必要な初期化を減らすことができ (通常、Web サイトのアクセス速度が向上します)、コードの保守と拡張が容易になります。
遅延読み込みは、「メンバー変数展開」機能の最も重要な用途です。もちろん、この機能には他の用途もあります。メンバー変数を操作するとき、実際には getXXX および setXXX メンバー関数を呼び出していることになります。コードの一部を呼び出しています。

2. イベント モデル
イベント モデルは、デザイン パターンにおける「オブザーバー パターン」です。オブジェクトの状態が変化すると、このオブジェクトは他のオブジェクトにイベントを通知できます。
イベント モデルを使用するには、次の 3 つの手順を実装する必要があります: 1. イベントを定義する; 2. イベント ハンドラーを登録する; 3. イベントをトリガーする。
CComponent のサブクラスは、on で始まるメンバー関数 (public function onClick(){...} など) を定義してイベントを定義し、attachEventHandler メンバー関数を呼び出してイベント ハンドラーを登録します (複数のイベント ハンドラーを登録できます)。 、最後に、raiseEvent を呼び出すことによってイベントがトリガーされます。
CComponent クラスは、イベントとそのイベントを処理するためのすべてのハンドルを保存するためにプライベート メンバー変数を使用します。ハッシュ テーブルのキーはイベントの名前とその値です。ハッシュテーブルはイベント処理機能のリンクリストです。

Yii フレームワーク分析 (5) - CComponent 基本クラスの話をもう一度しましょう

3. 動作クラスのバインディング
クラスに機能を追加するには 2 つの方法があります: 1. このクラスのコードを直接変更し、いくつかのメンバー関数とメンバー変数を追加します。 2. サブクラスを介して派生および拡張します。明らかに 2 番目の方法の方が保守と拡張が簡単です。複数の機能を 1 つのクラスに追加する必要がある場合 (複数のユーザーが異なる時間に)、マルチレベルの派生が必要となり、明らかにメンテナンス コストが増加します。
CComponent は特別な方法を使用して、クラス情報と動作のクラス バインディングを拡張します。動作クラスは CBehavior のサブクラスであり、CComponent は CBehavior クラスの 1 つ以上のメンバー関数とメンバー変数をそれ自体に追加し、不要な場合は一部の CBehavior クラスをアンインストールできます。簡単な例を次に示します。
//Calculator class
class Calculator extends CBehavior
{
public function add($x, $y) { return $x + $y }
public function sub($x, $y ) { return $x - $y; }
...
}
$comp = new CComponent();
//電卓機能をクラスに追加します
$comp->attachbehavior('calculator', new Calculator ());
$comp->add(2, 5);
$comp->sub(2, 5);
CComponent は 3 つのマジック メソッド __get、__set、__call を渡します (これら 3 つのマジック メソッドはメソッドの使用方法の詳細を参照)を参照してください: PHP 基本クラスとオブジェクト 13 - オーバーロード)、「ビヘイビアー クラス バインディング」機能を実装するには、CComponent クラスに存在しないメンバー変数とメンバー メソッドを呼び出すとき、CComponent クラスはこれら 3 つのマジック メソッドを調べます。 「動的にバインドされた動作オブジェクト」について説明します。つまり、存在しないメンバー変数とメンバー メソッドを「動的バインディング オブジェクト」にルーティングします。


Yii フレームワーク分析 (5) - CComponent 基本クラスの話をもう一度しましょう

CComponent クラスの特徴は次の 3 つの文に要約できます。

1. オブジェクトのメンバー変数を設定するときに、実際にコードを実行します。オブジェクトを監視することで、オブジェクトの内部状態が変化したときに他のオブジェクトに通知できます。
3. オブジェクトをより適切に拡張するには、オブジェクトにメンバー変数とメンバー関数を追加し、オブジェクトの状態を監視することもできます。オブジェクト。

上記は Yii フレームワーク分析 (5) - CComponent 基本クラスの内容について話しましょう。 さらに関連した内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


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