1
20

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.

  1. namespace OL;
  2.  
  3. use \InvalidArgumentException as InvalidArgumentException;
  4. 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.

  1. class Definition {

Le conteneur d'une classe est une classe PHP appelée Definition.

  1.     public $name;
  2.     public $revision;
  3.     public $superclass;
  4.  
  5.     public $c_properties;
  6.     public $i_properties;
  7.     public $c_messages;
  8.     public $i_messages;
  9.     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.

  1.     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.

  1.         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.

  1.         if (!(is_string($cname) and preg_match($varname, $cname))) {
  2.             throw new InvalidArgumentException();
  3.         }

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.

  1.         if (!(is_null($sc) or (is_object($sc) and __NAMESPACE__ . '\Definition' == get_class($sc)))) {
  2.             throw new InvalidArgumentException();
  3.         }

Vérifie si la superclasse est null ou une classe. Déclenche une exception InvalidArgumentException en cas d'erreur.

  1.         if (!(is_int($rev) and $rev > 0)) {
  2.             throw new InvalidArgumentException();
  3.         }

Vérifie si le numéro de révision est un entier > 0. Déclenche une exception InvalidArgumentException en cas d'erreur.

  1.         foreach (array($c_props, $i_props, $c_msgs, $i_msgs) as $arr) {
  2.             if (is_null($arr)) {
  3.                 continue;
  4.             }
  5.             if (is_array($arr)) {
  6.                 foreach ($arr as $s) {
  7.                     if (!(is_string($s) and preg_match($varname, $s))) {
  8.                         throw new InvalidArgumentException();
  9.                     }
  10.                 }
  11.                 continue;
  12.             }
  13.             throw new InvalidArgumentException();
  14.         }

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.

  1.         $this->name=$cname;
  2.         $this->revision=$rev;
  3.         $this->superclass='Object' != $cname ? ($sc ? $sc : $GLOBALS['Object']) : null;
  4.  
  5.         $this->c_properties=$c_props ? array_fill_keys($c_props, 0) : null;
  6.         $this->i_properties=$i_props ? array_fill_keys($i_props, 0) : null;
  7.         $this->c_messages=$c_msgs ? array_fill_keys($c_msgs, 0) : null;
  8.         $this->i_messages=$i_msgs ? array_fill_keys($i_msgs, 0) : null;
  9.  
  10.         $this->attributes=array();
  11.     }

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.

  1.     function __destruct() {
  2.         return class_send_message($this, 'free');
  3.     }

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.

  1.     function __toString() {
  2.         return 'class(' . $this->name . ')';
  3.     }

La représentation textuelle d'une classe retourne le mot class suivi par le nom de la classe entre parenthèses.

  1.     function sendself($msg, $args=false) {
  2.         return class_send_message($this, $msg, $args);
  3.     }

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.

  1.     function sendsuper($msg, $args=false) {
  2.         $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.

  1.         $fromfunc=count($backtrace) > 2 ? $backtrace[2]['function'] : false;
  2.         $pos=$fromfunc ? strpos($fromfunc, '\\c_') : false;
  3.         $fromclassname=$pos ? substr($fromfunc, 0, $pos) : false;
  4.         $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.

  1.         if (!$fromclass) {
  2.             throw new LogicException();
  3.         }

Déclenche une exception LogicException si sendsuper n'a pas été appelée à partir d'une méthode de classe.

  1.         return class_super_send_message($fromclass, $this, $msg, $args);
  2.     }
  3. }

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.

  1. class Instance {

Le conteneur d'un objet est une classe PHP appelée Instance.

  1.     public $class;
  2.     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.

  1.     function __construct($c) {

Construire une Instance prend 1 argument. $c est la référence globale de la classe de la nouvelle instance.

  1.         if (!(is_object($c) and __NAMESPACE__ . '\Definition' == get_class($c))) {
  2.             throw new InvalidArgumentException();
  3.         }

Vérifie si la classe est une Definition. Déclenche une exception InvalidArgumentException en cas d'erreur.

  1.         $this->class=$c;
  2.  
  3.         $this->attributes=array();
  4.     }

Initialise la nouvelle Instance.

NOTE : Seule la fonction class_make de l'Object Layer construits une Instance.

  1.     function __destruct() {
  2.         return object_send_message($this, 'free');
  3.     }

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.

  1.     function __toString() {
  2.         return 'object(' . $this->class->name . ')';
  3.     }

La représentation textuelle d'une instance retourne le mot object suivi par le nom de la classe de l'instance entre parenthèses.

  1.     function sendself($msg, $args=false) {
  2.         return object_send_message($this, $msg, $args);
  3.     }

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.

  1.     function sendsuper($msg, $args=false) {
  2.         $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.

  1.         $fromfunc=count($backtrace) > 2 ? $backtrace[2]['function'] : false;
  2.         $pos=$fromfunc ? strpos($fromfunc, '\\i_') : false;
  3.         $fromclassname=$pos ? substr($fromfunc, 0, $pos) : false;
  4.         $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.

  1.         if (!$fromclass) {
  2.             throw new LogicException();
  3.         }

Déclenche une exception LogicException si sendsuper n'a pas été appelée à partir d'une méthode d'instance.

  1.         return object_super_send_message($fromclass, $this, $msg, $args);
  2.     }
  3. }

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.
VOIR AUSSI

Interface, Object

Commentaires

Votre commentaire :
[p] [b] [i] [u] [s] [quote] [pre] [br] [code] [url] [email] strip aide 2000

Entrez un maximum de 2000 caractères.
Améliorez la présentation de votre texte avec les balises de formatage suivantes :
[p]paragraphe[/p], [b]gras[/b], [i]italique[/i], [u]souligné[/u], [s]barré[/s], [quote]citation[/quote], [pre]tel quel[/pre], [br]à la ligne,
[url]http://www.izend.org[/url], [url=http://www.izend.org]site[/url], [email]izend@izend.org[/email], [email=izend@izend.org]izend[/email],
[code]commande[/code], [code=langage]code source en c, java, php, html, javascript, xml, css, sql, bash, dos, make, etc.[/code].