ホームページ >バックエンド開発 >PHPチュートリアル >Yii Framework 公式ガイド シリーズ 10 - 基本: コンポーネント

Yii Framework 公式ガイド シリーズ 10 - 基本: コンポーネント

黄舟
黄舟オリジナル
2017-02-11 09:41:561091ブラウズ



Yii アプリケーションはコンポーネントに基づいて構築されています。コンポーネントは、CComponent またはそのサブクラスのインスタンスです。コンポーネントの使用には、主にそのプロパティへのアクセスと、いつトリガーまたは処理するかが含まれます。 基本クラス CComponent は、プロパティとイベントの定義方法を指定します。

1. コンポーネントのプロパティ

コンポーネントのプロパティは、オブジェクトのパブリック メンバー変数のようなものです。読み取りと書き込みが可能です。例:


$width=$component->textWidth;     // 获取 textWidth 属性
$component->enableCaching=true;   // 设置 enableCaching 属性

コンポーネントのプロパティを定義するには、コンポーネント クラスでパブリック メンバー変数を定義するだけで済みます。より柔軟な方法は、ゲッター メソッドとセッター メソッドを定義することです。例:


public function getTextWidth()
{
    return $this->_textWidth;
}

public function setTextWidth($value)
{
    $this->_textWidth=$value;
}

上記のコードは、textWidth という名前の書き込み可能なプロパティを定義します (名前は大文字と小文字が区別されません)。 )。 プロパティが読み取られるときは、 getTextWidth() が呼び出され、その戻り値がプロパティ値になります。同様に、プロパティが書き込まれるときは、 setTextWidth() が呼び出されます。 setter メソッドが定義されていない場合、プロパティは読み取り専用となり、書き込まれると例外がスローされます。 getter メソッドと setter メソッドを使用してプロパティを定義する利点の 1 つは、プロパティの読み取りまたは書き込み時に追加のロジック (検証の実行、イベントのトリガーなど) を実行できることです。 textWidth (名字是大小写不敏感的)。 当读取属性时,getTextWidth() 就会被调用,其返回值则成为属性值;相似的, 当写入属性时,setTextWidth() 被调用。如果 setter 方法没有定义,则属性将是只读的, 如果对其写入则会抛出一个异常。使用 getter 和 setter 方法定义一个属性有一个好处:即当读取或写入属性时, 可以执行额外的逻辑(例如,执行验证,触发事件)。

注意: 通过 getter / setter 定义的属性和类成员变量之间有一个细微的差异。前者的名字是大小写不敏感的, 而后者是大小写敏感的。

2. 组件事件

组件事件是一些特殊的属性,它们使用一些称作 事件句柄 (event handlers)的方法作为其值。 附加(分配)一个方法到一个事件将会引起方法在事件被唤起处自动被调用。因此, 一个组件的行为可能会被一种在部件开发过程中不可预见的方式修改。

组件事件以 on 开头的命名方式定义。和属性通过 getter/setter 方法来定义的命名方式一样, 事件的名称是大小写不敏感的。以下代码定义了一个 onClicked 事件:


public function onClicked($event)
{
    $this->raiseEvent('onClicked', $event);
}

这里作为事件参数的 $event 是 CEvent 或其子类的实例。

我们可以附加一个方法到此 event,如下所示:


$component->onClicked=$callback;

这里的 $callback 指向了一个有效的 PHP 回调。它可以是一个全局函数也可以是类中的一个方法。 如果是后者,它必须以一个数组的方式提供: array($object,'methodName').

事件句柄的结构如下:


function methodName($event)
{
    ......
}

这里的 $event 即描述事件的参数(它来源于 raiseEvent() 调用)。$event 参数是 CEvent 或其子类的实例。 至少,它包含了关于谁触发了此事件的信息。

从版本 1.0.10 开始,事件句柄也可以是一个PHP 5.3以后支持的匿名函数。例如,


$component->onClicked=function($event) {
    ......
}

如果我们现在调用 onClicked()onClicked 事件将被触发(在 onClicked() 中), 附属的事件句柄将被自动调用。

一个事件可以绑定多个句柄。当事件触发时, 这些句柄将被按照它们绑定到事件时的顺序依次执行。如果句柄决定组织后续句柄被执行,它可以设置 $event->handled 为 true。

3. 组件行为

从版本 1.0.2 开始,组件已添加了对 mixin 的支持,并可以绑定一个或多个行为。 行为 是一个对象,其方法可以被它绑定的部件通过收集功能的方式来实现 继承(inherited), 而不是专有化继承(即普通的类继承).一个部件可以以'多重继承'的方式实现多个行为的绑定.

行为类必须实现 IBehavior 接口。 大多数行为可以继承自 CBehavior 。如果一个行为需要绑定到一个 模型, 它也可以从专为模型实现绑定特性的 CModelBehavior 或 CActiveRecordBehavior 继承。

要使用一个行为,它必须首先通过调用此行为的 attach() 方法绑定到一个组件。然后我们就可以通过组件调用此行为方法:


// $name 在组件中实现了对行为的唯一识别
$component->attachBehavior($name,$behavior);
// test() 是行为中的方法。
$component->test();

已绑定的行为可以像一个组件中的普通属性一样访问。 例如,如果一个名为 tree

注: ゲッター/セッターを介して定義されたプロパティとクラス メンバー変数の間には微妙な違いがあります。前者の名前では大文字と小文字が区別されますが、後者の名前では大文字と小文字が区別されます。


2. コンポーネント イベント

コンポーネント イベントは、イベント ハンドラー と呼ばれるメソッドを値として使用する特別なプロパティです。 メソッドをイベントにアタッチ (割り当て) すると、イベントが発生した場所でメソッドが自動的に呼び出されます。したがって、コンポーネントの動作は、コンポーネント開発中に予期しない方法で変更される可能性があります。

コンポーネント イベントは、on で始まる命名メソッドを使用して定義されます。 getter/setter メソッドを通じて定義されたプロパティと同様、イベント名では大文字と小文字が区別されません。次のコードは、onClicked イベントを定義します。


$behavior=$component->tree;
// 等于下行代码:
// $behavior=$component->asa('tree');

🎜 ここでイベント パラメータとして使用される $event は、CEvent またはそのサブクラスのインスタンスです。 🎜🎜次のようにこのイベントにメソッドをアタッチできます: 🎜🎜🎜🎜🎜🎜
$component->disableBehavior($name);
// 下面的代码将抛出一个异常
$component->test();
$component->enableBehavior($name);
// 现在就可以使用了
$component->test();
🎜🎜🎜ここで、$callback は有効な PHP コールバックを指します。グローバル関数またはクラス内のメソッドにすることができます。 後者の場合は、配列として指定する必要があります: array($object,'methodName')。イベント ハンドラーの構造は次のとおりです: 🎜🎜🎜🎜🎜🎜rrreee🎜 🎜🎜ここ $event はイベントを説明するパラメータです (raiseEvent() 呼び出しから取得されます)。 $event パラメータは、CEvent またはそのサブクラスの 1 つのインスタンスです。 少なくとも、誰がイベントをトリガーしたかに関する情報が含まれています。 🎜🎜バージョン 1.0.10 以降、イベント ハンドラーは PHP 5.3 以降でサポートされる匿名関数にすることもできます。たとえば、🎜🎜🎜🎜🎜🎜rrreee🎜🎜🎜ここで onClicked() を呼び出すと、onClicked イベントがトリガーされます (onClicked() )、アタッチされたイベント ハンドラーが自動的に呼び出されます。 🎜🎜 イベントは複数のハンドルにバインドできます。イベントが発生すると、これらのハンドラーはイベントにバインドされた順序で実行されます。ハンドラーが後続のハンドラーの実行を禁止すると決定した場合、$event->handled を true に設定できます。 🎜🎜3. コンポーネントの動作🎜🎜 バージョン 1.0.2 以降、コンポーネントはミックスインのサポートを追加し、1 つ以上の動作をバインドできるようになりました。 <em>動作</em>は、特殊な継承(つまり、コンポーネントが実装できる通常のクラス継承)ではなく、<code>継承された関数を収集することによってバインドされているコンポーネントによってメソッドを実装できるオブジェクトです。 「多重継承」の形式での複数の動作のバインディング 🎜🎜動作クラスは IBehavior インターフェイスを実装する必要があります。 ほとんどの動作は CBehavior から継承できます。動作をモデルにバインドする必要がある場合は、モデル専用のバインド機能を実装する CModelBehavior または CActiveRecordBehavior から継承することもできます。 🎜🎜ビヘイビアを使用するには、まずこのビヘイビアーのattach() メソッドを呼び出して、ビヘイビアーをコンポーネントにバインドする必要があります。次に、コンポーネントを通じてこの動作メソッドを呼び出すことができます。 🎜🎜🎜🎜🎜🎜rrreee🎜🎜🎜 バインドされた動作は、コンポーネントの通常のプロパティと同様にアクセスできます。 たとえば、tree という名前のビヘイビアーがコンポーネントにバインドされている場合、次のコードを通じてこのビヘイビアーへの参照を取得できます。 🎜🎜🎜🎜🎜🎜rrreee🎜🎜🎜の動作は一時的に無効にすることができます。その場合、そのメソッドはコンポーネント内で無効になります。例: 🎜🎜🎜🎜🎜。
$component->disableBehavior($name);
// 下面的代码将抛出一个异常
$component->test();
$component->enableBehavior($name);
// 现在就可以使用了
$component->test();

两个同名行为绑定到同一个组件下是有可能的。在这种情况下,先绑定的行为则拥有优先权。

当和 events, 一起使用时,行为会更加强大。当行为被绑定到组件时,行为里的一些方法就可以绑定到组件的一些事件上了. 这样一来,行为就可以观察或者改变组件的常规执行流程。

自版本 1.1.0 开始,一个行为的属性也可以通过绑定到的组件来访问。 这些属性包含公共成员变量以及通过 getters 和/或 setters 方式设置的属性。 例如, 若一个行为有一个 xyz 的属性,此行为被绑定到组件 $a,然后我们可以使用表达式 $a->xyz 访问此行为的属性。

以上就是Yii框架官方指南系列10——基础知识:组件的内容,更多相关内容请关注PHP中文网(www.php.cn)!


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