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