Cet article peut être utilisé comme complément à "Yii Framework Analysis (2) - CComponent Class Analysis".
La classe CComponent constitue la base de la programmation basée sur les composants et pilotée par les événements du framework YII. La plupart des classes du framework YII utilisent la classe CComponent comme classe de base. La classe CComponent fournit 3 fonctionnalités pour ses sous-classes :
1. Expansion des variables membres
Définissez une variable membre en définissant deux fonctions membres (getXXX/setXXX), telles que :
fonction publique getText() {…}
public function setText {…}
Cela équivaut à définir une variable membre $text, qui peut être appelée comme ceci
$a=new CComponent; $a=$component->text; // 等价于$a=$component->getText(); $component->text='abc'; // 等价于$component->setText('abc');
CComponent se fait via la méthode magique __get et __set sont utilisés pour implémenter la fonctionnalité "expansion des variables membres". Si une variable membre qui n'existe pas dans la classe elle-même est exploitée, PHP appellera les méthodes __get et __set de cette classe pour le traitement. CComponent utilise ces deux méthodes magiques pour implémenter la fonctionnalité « expansion des variables membres ». La figure suivante décrit une sous-classe de CComponent, qui ajoute deux variables membres, active et sessionName. La figure décrit le processus d'appel de ces deux variables membres.
(Remarque : Concernant l'utilisation des méthodes magiques __get et __set, veuillez vous référer à : PHP Basic Classes and Objects 13 - Surcharge)
En programmation orientée objet, il suffit de définir directement une variable membre. Pourquoi CComponent implémente-t-il une variable membre en définissant deux fonctions ? L'une des principales raisons est la nécessité de « retarder le chargement » des variables membres. Généralement, les variables membres d'une classe sont assignées de manière uniforme dans le constructeur ou la fonction d'initialisation, mais toutes les variables membres ne seront pas affectées lors du traitement d'une requête Web. Par exemple, la classe App définit deux variables membres : $cache et $db ($cache est un objet de cache, $db est un objet de lien de base de données. Ces deux objets sont créés lors de l'initialisation de la classe App, mais un Web For). Certaines pages du site Web, le contenu peut être obtenu via le cache, de sorte que l'objet lien de base de données n'a pas réellement besoin d'être créé. Si App est défini comme une sous-classe de CComponent, deux méthodes sont définies dans la classe App : getCache/getDb, afin que la fonction getDb soit appelée pour initialiser le lien de base de données lorsque la variable membre db est utilisée pour la première fois. - c'est-à-dire initialiser lors de la première utilisation. Bien que le chargement retardé ajoute un appel de fonction supplémentaire, il peut réduire l'initialisation inutile des variables membres (améliorant généralement la vitesse d'accès du site Web) et peut rendre notre code plus facile à maintenir et à développer.
Le chargement différé devrait être l'utilisation la plus importante de la fonctionnalité "Expansion de variable membre". Bien sûr, cette fonctionnalité a également d'autres utilisations. Pensez-y, lorsque vous utilisez une variable membre, vous appelez en fait les fonctions membres getXXX et setXXX. , vous appelez un morceau de code !
2. Modèle d'événement
Le modèle d'événement est le "modèle d'observateur" dans le modèle de conception : lorsque l'état d'un objet change, alors cet objet peut notifier d'autres objets de l'événement.
Pour utiliser le modèle d'événement, vous devez mettre en œuvre ces trois étapes : 1. Définir l'événement 2. Enregistrez le gestionnaire d'événement ; 3. Déclenchez l'événement.
Une sous-classe de CComponent définit un événement en définissant une fonction membre commençant par on, telle que : public function onClick(){…}, puis enregistre le gestionnaire d'événements en appelant la fonction membre attachEventHandler (plusieurs gestionnaires d'événements peuvent être enregistrés ) , et enfin déclencher l'événement en appelant raiseEvent.
La classe CComponent utilise une variable membre privée pour enregistrer l'événement et tous les handles pour traiter l'événement. Cette variable membre peut être considérée comme une table de hachage. La clé de la table de hachage est le nom de l'événement et la valeur. de la table de hachage est la liste chaînée de la fonction de traitement des événements.
3. Liaison de classe de comportement
Il existe deux façons d'ajouter des fonctionnalités à une classe : 1. Modifier directement le code de cette classe et ajouter des fonctions membres et des variables membres ; Évidemment, la deuxième méthode est plus facile à maintenir et à développer. Si plusieurs fonctionnalités doivent être ajoutées à une classe (plusieurs personnes à des moments différents), une dérivation à plusieurs niveaux est alors nécessaire, ce qui augmente évidemment les coûts de maintenance.
CComponent utilise un moyen spécial pour étendre les informations de classe : la liaison de classe de comportement. La classe de comportement est une sous-classe de CBehavior. CComponent peut s'ajouter une ou plusieurs fonctions membres et variables membres de la classe CBehavior et désinstaller certaines classes CBehavior lorsqu'elles ne sont pas nécessaires. Voici un exemple simple :
//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();
//Ajouter pour ma fonction de calculatrice de classe
$comp->attachbehavior('calculator', new Calculator());
$comp->add(2, 5);
$comp->sub(2, 5);
CComponent implémente la « liaison de classe de comportement » via trois méthodes magiques : __get, __set et __call (pour plus de détails sur l'utilisation de ces trois méthodes magiques, voir : PHP Basic Classes and Objects 13 - Overloading) « Avec cette fonctionnalité, lors de l'appel d'un membre variables et méthodes membres qui n'existent pas dans la classe CComponent, la classe CComponent recherchera "l'objet de comportement lié dynamiquement" via ces trois méthodes magiques. Autrement dit, acheminer les variables membres et les méthodes membres inexistantes vers « l’objet de liaison dynamique ».
Les caractéristiques de la classe CComponent peuvent être résumées en 3 phrases :
1. Mieux configurer un objet lors de la configuration lors de l'accès. variables membres d'un objet, il exécute en fait un morceau de code ;
2. Meilleure surveillance d'un objet. Lorsque l'état interne de l'objet change, d'autres objets peuvent être avertis ;
3. ajoutez des variables membres et des fonctions membres à un objet et pouvez également surveiller l'état de l'objet.
Ce qui précède est l'analyse du framework Yii (5) - parlons du contenu de la classe de base CComponent. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !