Der in Hangman definierte GameController verwendet einige Attributwörter. Sie können das Format von $this->word verwenden, um dieses Attribut zu lesen und zu schreiben, aber tatsächlich ist die diesem Attribut in GameController entsprechende Methode
/** * @return string the word to be guessed. This value is persistent * during the whole game session. */ public function getWord() { return $this->getPageState('word'); } /** * @param string the word to be guessed. This value is persistent * during the whole game session. */ public function setWord($value) { $this->setPageState('word',$value); }
Das heißt, definieren Sie ein Attributwort, das Lese- und Schreibvorgänge unterstützt, indem Sie getWord und setWord definieren (bei dem Namen wird die Groß-/Kleinschreibung nicht beachtet). Wenn das Attribut gelesen wird, wird getWord() aufgerufen und sein Rückgabewert wird Attributwert; in ähnlicher Weise wird beim Schreiben einer Eigenschaft setWord() aufgerufen. Wenn die Setter-Methode nicht definiert ist, ist die Eigenschaft schreibgeschützt und es wird eine Ausnahme ausgelöst, wenn darauf geschrieben wird. Ein Vorteil der Definition einer Eigenschaft mithilfe von Getter- und Setter-Methoden besteht darin, dass beim Lesen oder Schreiben der Eigenschaft zusätzliche Logik ausgeführt werden kann (z. B. Durchführung von Validierungen, Auslösen von Ereignissen).
Neben der Definition von Eigenschaften unterstützt die Basisklasse CComponent auch das Auslösen von Ereignissen, was den UI-Komponenten in ASP.Net sehr ähnlich ist.
Komponentenereignisse sind spezielle Eigenschaften, die als Werte sogenannte Ereignishandler verwenden. Durch das Anhängen (Zuweisen) einer Methode an ein Ereignis wird die Methode automatisch dort aufgerufen, wo das Ereignis ausgelöst wird. Daher kann sich das Verhalten einer Komponente auf eine Weise ändern, die während der Komponentenentwicklung unvorhergesehen war.
Komponentenereignisse werden mit Namen definiert, die mit „on“ beginnen. Wie bei Eigenschaften, die durch Getter/Setter-Methoden definiert werden, wird bei Ereignisnamen die Groß-/Kleinschreibung nicht beachtet. Der folgende Code definiert ein onClicked-Ereignis:
public function onClicked($event){$this->raiseEvent('onClicked', $event);}
Das hier als Ereignisparameter verwendete $event ist eine Instanz von CEvent oder seiner Unterklasse.
Wir können diesem Ereignis wie folgt eine Methode anhängen:
$component->onClicked=$callback;
Hier zeigt $callback auf einen gültigen PHP-Callback. Es kann eine globale Funktion oder eine Methode in einer Klasse sein. Wenn es sich um Letzteres handelt, muss es als Array bereitgestellt werden: array($object,'methodName').
Die Struktur des Event-Handlers ist wie folgt:
function methodName($event) { ...... }
Hier ist $event der Parameter, der das Ereignis beschreibt (er kommt vom raiseEvent()-Aufruf). Der Parameter $event ist eine Instanz von CEvent oder einer seiner Unterklassen. Es enthält mindestens Informationen darüber, wer das Ereignis ausgelöst hat.
Ab Version 1.0.10 kann der Event-Handler auch eine anonyme Funktion sein, die von PHP 5.3 und höher unterstützt wird. Beispiel:
$component->onClicked=function($event) { ...... }
Wenn wir jetzt onClicked() aufrufen, wird das onClicked-Ereignis ausgelöst (in onClicked()) und der angehängte Ereignishandler wird automatisch aufgerufen.
Ein Ereignis kann an mehrere Handles gebunden werden. Wenn ein Ereignis ausgelöst wird, werden diese Handler in der Reihenfolge ausgeführt, in der sie an das Ereignis gebunden wurden. Wenn der Handler beschließt, die Ausführung nachfolgender Handler zu verhindern, kann er $event->handled auf true setzen.
Ab Version 1.0.2 bietet die Komponente Unterstützung für Mixins und kann ein oder mehrere Verhalten binden. Ein Verhalten ist ein Objekt, dessen Methoden von der Komponente, an die es gebunden ist, durch Sammelfunktionen geerbt werden können, und nicht durch eine spezialisierte Vererbung (d. h. eine gewöhnliche Klassenvererbung). Eine Komponente kann auf die Art und Weise einer „Mehrfachvererbung“ geerbt werden, die die Bindung mehrerer Verhaltensweisen implementiert.
Die Verhaltensklasse muss die IBehavior-Schnittstelle implementieren. Die meisten Verhaltensweisen können von CBeavior geerbt werden. Wenn ein Verhalten an ein Modell gebunden werden muss, kann es auch von CModelBehavior oder CActiveRecordBehavior erben, die Bindungsfunktionen speziell für das Modell implementieren.
Um ein Verhalten zu verwenden, muss es zunächst an eine Komponente gebunden werden, indem die Methode attachment() dieses Verhaltens aufgerufen wird. Dann können wir diese Verhaltensmethode über die Komponente aufrufen:
// $name 在组件中实现了对行为的唯一识别 $component->attachBehavior($name,$behavior);// test() 是行为中的方法。 $component->test();已绑定的行为可以像一个组件中的普通属性一样访问。 例如,如果一个名为 tree 的行为绑定到了一个组件,我们就可以通过如下代码获得指向此行为的引用。 $behavior=$component->tree;// 等于下行代码: // $behavior=$component->asa('tree');行为是可以被临时禁止的,此时它的方法开就会在组件中失效.例如: $component->disableBehavior($name);// 下面的代码将抛出一个异常 $component->test(); $component->enableBehavior($name);// 现在就可以使用了
$component->test(); In diesem Fall ist es möglich, dass zwei Verhaltensweisen mit demselben Namen an dieselbe Komponente gebunden werden , hat das zuerst gebundene Verhalten Vorrang.
Verhaltensweisen sind noch wirkungsvoller, wenn sie mit Ereignissen verwendet werden. Wenn ein Verhalten an eine Komponente gebunden ist, können einige Methoden im Verhalten an einige Ereignisse der Komponente gebunden werden. Auf diese Weise kann das Verhalten organisch beobachtet werden oder der reguläre Ausführungsfluss der Komponente verändert werden.
Ab Version 1.1.0 kann auf die Eigenschaften eines Verhaltens auch über die Komponente zugegriffen werden, an die es gebunden ist. Zu diesen Eigenschaften gehören öffentliche Mitgliedsvariablen und Eigenschaften, die über Getter und/oder Setter festgelegt werden. Wenn ein Verhalten beispielsweise eine Eigenschaft xyz hat und dieses Verhalten an die Komponente $a gebunden ist, können wir mit dem Ausdruck $a->xyz auf die Eigenschaft dieses Verhaltens zugreifen.
Das Obige ist der Inhalt der CComponent-Komponente des PHP-Entwicklungsframeworks Yii Framework-Tutorial (6). Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).