Object Layer
L'Object Layer implémente les conteneurs des classes et des instances So-o et toutes les fonctions nécessaires à la classe Object.
Tout le code de l'Object Layer de So-o est dans le fichier OL.php.
- namespace OL;
- use \InvalidArgumentException as InvalidArgumentException;
- use \LogicException as LogicException;
Le code de l'Object Layer est placé dans son propre espace de nommage.
Remarquez que seules les fonctions de l'interface de So-o et les méthodes de la classe Object accèdent à ce code.
- class Definition {
Le conteneur d'une classe est une classe PHP appelée Definition.
- public $name;
- public $revision;
- public $superclass;
- public $c_properties;
- public $i_properties;
- public $c_messages;
- public $i_messages;
- public $attributes;
$name contient le nom de la classe.
$revision est un nombre que le programmeur peut utiliser pour différencier des versions successives de la classe.
$superclass pointe sur la superclasse de la classe. Sa valeur est la référence globale d'une autre classe telle que $Object ou null pour la classe Object.
$c_properties et $c_messages listent les propriétés et les messages de la classe.
$i_properties et $i_messages listent les propriétés et les messages d'une instance de la classe.
$attributes contient les valeurs des propriétés d'une classe.
- function __construct($cname, $sc, $rev, $c_props, $i_props, $c_msgs, $i_msgs) {
Construire une Definition prend 7 arguments.
$cname spécifie le nom de la classe, un nom de variable valide.
$sc est la référence globale de la superclasse ou null.
$rev est le numéro de révision de la classe, un entier > 0.
$c_props donne les noms des propriétés de la classe, un tableau de chaînes de caractères ou null.
$i_props donne les noms des propriétés d'une instance, un tableau de chaînes de caractères ou null.
$c_msgs donne les noms des messages de la classe, un tableau de chaînes de caractères ou null.
$i_msgs donne les noms des messages d'une instance, un tableau de chaînes de caractères ou null.
- static $varname='/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/';
$varname contient une expression régulière qui correspond à un nom de variable PHP valide.
- if (!(is_string($cname) and preg_match($varname, $cname))) {
- throw new InvalidArgumentException();
- }
Vérifie si le nom de la classe est une chaîne de caractères et un nom de variable valide. Déclenche une exception InvalidArgumentException en cas d'erreur.
- if (!(is_null($sc) or (is_object($sc) and __NAMESPACE__ . '\Definition' == get_class($sc)))) {
- throw new InvalidArgumentException();
- }
Vérifie si la superclasse est null ou une classe.
Déclenche une exception InvalidArgumentException en cas d'erreur.
- if (!(is_int($rev) and $rev > 0)) {
- throw new InvalidArgumentException();
- }
Vérifie si le numéro de révision est un entier > 0. Déclenche une exception InvalidArgumentException en cas d'erreur.
- foreach (array($c_props, $i_props, $c_msgs, $i_msgs) as $arr) {
- if (is_null($arr)) {
- continue;
- }
- if (is_array($arr)) {
- foreach ($arr as $s) {
- if (!(is_string($s) and preg_match($varname, $s))) {
- throw new InvalidArgumentException();
- }
- }
- continue;
- }
- throw new InvalidArgumentException();
- }
Vérifie si les propriétés et les messages de la classe et d'une instance sont null ou des listes de chaînes de caractères qui sont des noms de variable PHP valides.
Déclenche une exception InvalidArgumentException en cas d'erreur.
- $this->name=$cname;
- $this->revision=$rev;
- $this->superclass='Object' != $cname ? ($sc ? $sc : $GLOBALS['Object']) : null;
- $this->c_properties=$c_props ? array_fill_keys($c_props, 0) : null;
- $this->i_properties=$i_props ? array_fill_keys($i_props, 0) : null;
- $this->c_messages=$c_msgs ? array_fill_keys($c_msgs, 0) : null;
- $this->i_messages=$i_msgs ? array_fill_keys($i_msgs, 0) : null;
- $this->attributes=array();
- }
Initialise la nouvelle Definition.
Si $sc est null, la superclasse de la classe vaut $Object excepté pour la classe Object qui est la seule classe sans superclasse.
Les listes des propriétés et des messages de classe et d'instance sont gardées dans des tableaux associatifs pour que le code qui vérifie si une propriété ou un message est implémenté par la classe soit plus performant.
NOTE : Seule la fonction defclass de l'interface peut construire une Definition.
- function __destruct() {
- return class_send_message($this, 'free');
- }
Quand une classe n'est plus référencée, le message free lui est automatiquement envoyé.
NOTE : La méthode de classe free définie par la classe Object ne fait rien.
Dans la plupart des cas, __destruct peut être supprimée.
- function __toString() {
- return 'class(' . $this->name . ')';
- }
La représentation textuelle d'une classe retourne le mot class suivi par le nom de la classe entre parenthèses.
- function sendself($msg, $args=false) {
- return class_send_message($this, $msg, $args);
- }
sendself envoie $msg avec $args en argument à la classe.
$args est false ou un tableau.
sendself retourne simplement le résultat de l'appel de class_send_message avec la classe, le message et les paramètres du message en argument.
NOTE : Seule la fonction sendmsg de l'interface appelle la méthode sendself d'une Definition.
- function sendsuper($msg, $args=false) {
- $backtrace=debug_backtrace(false);
sendsuper envoie $msg avec $args en argument à la classe, dans le contexte de la classe dont la méthode de classe a appelé sendsuper.
Le code trouve la classe de la méthode en cours d'exécution en analysant la sortie de la fonction debug_backtrace de PHP.
- $fromfunc=count($backtrace) > 2 ? $backtrace[2]['function'] : false;
- $pos=$fromfunc ? strpos($fromfunc, '\\c_') : false;
- $fromclassname=$pos ? substr($fromfunc, 0, $pos) : false;
- $fromclass=($fromclassname and isset($GLOBALS[$fromclassname])) ? $GLOBALS[$fromclassname] : false;
Met $fromfunc au nom de la fonction qui a appelé supersend.
Met $fromclassname au nom de la classe qui a défini cette fonction en extrayant l'espace de nommage de $fromfunc.
Met $fromclass à la référence globale de la classe dont le nom est $fromclassname.
- if (!$fromclass) {
- throw new LogicException();
- }
Déclenche une exception LogicException si sendsuper n'a pas été appelée à partir d'une méthode de classe.
- return class_super_send_message($fromclass, $this, $msg, $args);
- }
- }
Retourne le résultat de l'appel de class_super_send_message avec la classe de la méthode de l'appel, la classe, le message et les paramètres du message en argument.
NOTE : Seule la fonction supersend de l'interface appelle la méthode sendsuper d'une Definition.
- class Instance {
Le conteneur d'un objet est une classe PHP appelée Instance.
- public $class;
- public $attributes;
$class est la référence globale de la classe de l'instance.
$attributes contient les valeurs des propriétés d'une instance.
- function __construct($c) {
Construire une Instance prend 1 argument.
$c est la référence globale de la classe de la nouvelle instance.
- if (!(is_object($c) and __NAMESPACE__ . '\Definition' == get_class($c))) {
- throw new InvalidArgumentException();
- }
Vérifie si la classe est une Definition. Déclenche une exception InvalidArgumentException en cas d'erreur.
- $this->class=$c;
- $this->attributes=array();
- }
Initialise la nouvelle Instance.
NOTE : Seule la fonction class_make de l'Object Layer construits une Instance.
- function __destruct() {
- return object_send_message($this, 'free');
- }
Quand une instance n'est plus référencée, le message free lui est automatiquement envoyé.
NOTE : La méthode d'instance free définie par la classe Object ne fait rien.
Dans la plupart des cas, __destruct peut être supprimée.
- function __toString() {
- return 'object(' . $this->class->name . ')';
- }
La représentation textuelle d'une instance retourne le mot object suivi par le nom de la classe de l'instance entre parenthèses.
- function sendself($msg, $args=false) {
- return object_send_message($this, $msg, $args);
- }
sendself envoie $msg avec $args en argument à l'instance.
$args est false ou un tableau.
sendself retourne le résultat de l'appel de object_send_message avec l'instance, le message et les paramètres du message en argument.
NOTE : Seule la fonction sendmsg de l'interface appelle la méthode sendself d'une Instance.
- function sendsuper($msg, $args=false) {
- $backtrace=debug_backtrace(false);
sendsuper envoie $msg avec $args en argument à l'instance, dans le contexte de la classe dont la méthode d'instance a appelé sendsuper.
Le code trouve la classe de la méthode en cours d'exécution en analysant la sortie de la fonction debug_backtrace de PHP.
- $fromfunc=count($backtrace) > 2 ? $backtrace[2]['function'] : false;
- $pos=$fromfunc ? strpos($fromfunc, '\\i_') : false;
- $fromclassname=$pos ? substr($fromfunc, 0, $pos) : false;
- $fromclass=($fromclassname and isset($GLOBALS[$fromclassname])) ? $GLOBALS[$fromclassname] : false;
Met $fromfunc au nom de la fonction qui a appelé supersend.
Met $fromclassname au nom de la classe qui a défini cette fonction en extrayant son espace de nommage.
Met $fromclass à la référence globale de la classe dont le nom est $fromclassname.
- if (!$fromclass) {
- throw new LogicException();
- }
Déclenche une exception LogicException si sendsuper n'a pas été appelée à partir d'une méthode d'instance.
- return object_super_send_message($fromclass, $this, $msg, $args);
- }
- }
Retourne le résultat de l'appel de object_super_send_message avec la classe de la méthode de l'appel, l'instance, le message et les paramètres du message en argument.
NOTE : Seule la fonction supersend de l'interface appelle la méthode sendsuper d'une Instance.
Le reste du code implémente toutes les fonctions de l'Object Layer dont la classe Object a besoin.
- class_class_method_symbol
- Retourne le nom d'une méthode de classe.
- class_instance_method_symbol
- Retourne le nom d'une méthode d'instance.
- class_name
- Retourne le nom d'une classe.
- class_revision
- Retourne le numéro de révision d'une classe.
- class_superclass
- Retourne la superclasse d'une classe.
- class_class_properties
- Retourne les propriétés de classe définies par une classe.
- class_instance_properties
- Retourne les propriétés d'instance définies par une classe.
- class_class_messages
- Retourne les messages de classe définis par une classe.
- class_instance_messages
- Retourne les messages d'instance définis par une classe.
- class_set_class_properties
- Initialise les propriétés de classe d'une classe.
- class_set_instance_properties
- Initialise les propriétés d'instance d'une classe.
- class_set_class_messages
- Initialise les messages de classe d'une classe.
- class_set_instance_messages
- Initialise les messages d'instance d'une classe.
- class_add_class_message
- Ajoute un message de classe à une classe.
- class_remove_class_message
- Retire un message de classe à une classe.
- class_add_instance_message
- Ajoute un message d'instance à une classe.
- class_remove_instance_message
- Retire un message d'instance à une classe.
- class_add_class_property
- Ajoute une propriété de classe à une classe.
- class_remove_class_property
- Retire une propriété de classe à une classe.
- class_add_instance_property
- Ajoute une propriété d'instance à une classe.
- class_remove_instance_property
- Retire une propriété d'instance à une classe.
- class_attributes
- Retourne les valeurs des propriétés d'une classe.
- class_set_attributes
- Initialise les valeurs des propriétés d'une classe.
- class_is_kind_of
- Vérifie si une classe est une sous-classe d'une autre classe.
- class_get
- Retourne la valeur d'une propriété d'une classe.
- class_set
- Modifie la valeur d'une propriété d'une classe.
- class_make
- Retourne une nouvelle instance d'une classe.
- class_check
- Vérifie l'intégrité d'une classe.
- object_class
- Retourne la classe d'une instance.
- object_superclass
- Retourne la superclasse d'une instance.
- object_assume
- Change la classe d'une instance.
- object_attributes
- Retourne les valeurs des propriétés d'une instance.
- object_set_attributes
- Initialise les valeurs des propriétés d'une instance.
- object_get
- Retourne la valeur d'une propriété d'une instance.
- object_set
- Modifie la valeur d'une propriété d'une instance.
- object_copy
- Retourne une copie d'une instance.
- class_find_class_property
- Vérifie si une propriété de classe d'une classe existe.
- class_find_instance_property
- Vérifie si une propriété d'instance d'une classe existe.
- class_find_class_method_class
- Retourne la classe qui implémente un message de classe.
- class_find_class_method
- Retourne la fonction qui implémente un message de classe.
- class_find_instance_method_class
- Retourne la classe qui implémente un message d'instance.
- class_find_instance_method
- Retourne la fonction qui implémente un message d'instance.
- class_apply_method
- Exécute une méthode de classe.
- class_send_message
- Exécute un message de classe.
- class_super_send_message
- Exécute un message de classe hérité d'une superclasse.
- object_apply_method
- Exécute une méthode d'instance.
- object_send_message
- Exécute un message d'instance.
- object_super_send_message
- Exécute un message d'instance hérité d'une superclasse.
Commentaires