Archives par mot-clef : méthode

Class abstraites et finales

Catégorie : PHP objet | 2 commentaires

Les notions de class abstraites et finales permettent de sécuriser notre programmation PHP, dans le sens qu’elles permettent d’éviter qu’un programmeur, reprenant notre code, n’en contourne la logique et s’égare ainsi sur une fausse piste. En effet : * __Class abstraite__ : class qui ne peut être instanciée, il est donc OBLIGATOIRE de créer une class héritante de cette class pour s’en servir. Utile lorsque l’on créé une class générique qui ne servira qu’à créer des sous class et non à être instanciée. Une telle class ne contient donc pas de @@__construct()@@ puisqu’elle n’est pas instanciée. Mot clef : @@abstract@@. * __Class finale__ : class qui NE PEUT PLUS avoir de sous class, de class héritante. Les méthodes de cette class ne pourront être surchargées (réécrites, redéfinies). Mot clef : @@final@@. De la même manière, on peut aussi déclarer des méthodes abstraites et finales. * __Méthode abstraite__ : méthode qui doit OBLIGATOIREMENT être surchargée (réécrite, ou redéfinie). Une class contenant une méthode abstraite doit aussi être abstraite. Mot clef : @@abstract@@. * __Méthode finale__ : méthode qui NE PEUT ETRE surchargée (réécrite, redéfinie). Une class finale s’applique sur toutes les méthodes ou attributs de la classe, alors qu’ici on ne touche qu’à une seule méthode. Mot clef : @@final@@. Pour bien comprendre ces 2 notions et en saisir mieux l’interêt voici plusieurs exemples, un pour chaque cas. !!!Class et méthodes abstraites /// abstract class Site { protected $type; protected $name; public function getType() { return $this->type; } public function getName() { return $this->name; } } $monSite = new Site(); echo $monSite->getType(); // Erreur : on tente d’instancier une classe abstraite /// Ici, on a créé une class abstraite Site, qui est donc censé représentée un site Internet en général. Cela n’est pas dépourvue de logique puisque cette class telle quelle ne suffit pas à définir un site, il est nécessaire de lui ajouter des attributs, des méthodes et de surcharger les éléments déjà existants. Et donc si on tente d’instancier cette class abstraite : jolie erreur… ///[apache] Fatal error: Cannot instantiate abstract class Site in /var/www/test.php on line 5 /// Par contre, si on créé une sous-class, aucun problème. Et maintenant si on ajoutait une méthode abstraite… /// abstract class Site { protected $type; protected $name; abstract function afficherArticle(); public function getType() { return $this->type; } public function getName() { return $this->name; } } class Blog extends Site { public function __construct($name) { $this->name = $name; $this->type = ‘blog’; } } $monBlog = new Blog(’30 minutes par jour’); echo $monSite->getType(); // Erreur : une méthode abstraite n’a pas été surchargée /// Et encore une erreur : /// Fatal error: Class Blog contains 1 abstract method and must therefore be declared abstract or implement the remaining method (Site::afficherArticle) in /var/www/test.php on line 7 /// Mais si on surcharge la méthode abstraite en question : tout va bien ! /// class Blog extends Site { public function __construct($name) { $this->name = $name; $this->type = ‘blog’; } function afficherArticle() { echo ‘Ceci est un magnifique article. Qui l\’eut cru ?’; } } $monBlog = new Blog(’30 minutes par jour’); echo $monSite->getType(); /// Qui nous affiche bien le mot « blog ». !!!Class et méthodes finales Bon, maintenant imaginons que j’ai finis toute la programmation de mon super blog 30 minutes par jour et que cela se résume en la class @@Blog30minparjour@@ ci-dessous ! Du coup, histoire de ne pas faire de bêtises, j’ai mis cette class en final. (ce n’est sûrement pas comme ça dans la vraie vie, mais qu’importe, on comprend l’idée) /// final class Blog30minparjour { public $name= ’30minparjour’; public $type; function __construct($type) { $this->$type; } function fairePleinDeTruc() { echo ‘Cette fonction fait tout pour 30 minutes par jour !
‘; } } /// Maintenant, si je souhaite faire une sous class pour mon nouveau blog 10 minutes par mois, je pourrais être flemmard et faire : /// class Blog10minparmois extends Blog30minparjour { public $name = ’10minparmois’; function fairePleinDeTruc() { echo ‘Cette fonction fait encore plus de choses, enfin, je crois…
‘; } } /// Mais là, PHP me rappelle à l’ordre (la flemmardise c’est mal !) en me renvoyant une erreur. En effet, je tente de surcharger des attributs et des méthodes qui font parties d’une class finale. Bon, reprenons le même exemple, sauf que cette fois-ci seul la fonction @@fairePleinDeTruc()@@ est finale. /// class Blog30minparjour { public $name= ’30minparjour’; public $type; function __construct($type) { $this->$type; } final function fairePleinDeTruc() { echo ‘Cette fonction fait tout pour 30 minutes par jour !
‘; } } class Blog10minparmois extends Blog30minparjour { public $name = ’10minparmois’; } $blog = new Blog10minparmois(‘blog’); $blog->fairePleinDeTruc(); /// Aucun problème, puisque je n’ai pas surchargé ma méthode @@fairePleinDeTruc()@@ dans la sous class @@Blog10minparmois@@. « Cette fonction fait tout pour 30 minutes par jour ! » s’affiche bien. Par contre, si je cherche à surcharger @@fairePleinDeTruc()@@, PHP n’est pas content : /// class Blog30minparjour { public $name= ’30minparjour’; public $type; function __construct($type) { $this->$type; } final function fairePleinDeTruc() { echo ‘Cette fonction fait tout pour 30 minutes par jour !
‘; } } class Blog10minparmois extends Blog30minparjour { public $name = ’10minparmois’; function fairePleinDeTruc() { echo ‘Cette fonction fait encore plus de choses, enfin, je crois…
‘; } } /// Eh bien voilà ! 2 petits mots clefs qui peuvent servir… parfois. Je me demande si je m’en servirais un jour.

Quelques méthodes et constantes magiques ou prédéfinies

Catégorie : PHP objet | Laisser un commentaire

!!!Attributs ou méthodes qui n’existent pas ? Avant de faire un petit récapitulatif magique ou déjà défini (mouahaha), voyons une petite notion importante du PHP objet : il est possible de modifier et de lire la valeur d’un attribut qui n’existe pas (ah horreur), par contre, on ne peut utiliser une méthode qui n’existe pas (ah bah ça tombe bien alors !). Je m’explique en codant : /// class Chat { } $unChat = new Chat(); $unChat->couleur = ‘noir’; $unChat->etat = ‘griffes sorti’; echo ‘Mon chat ‘.$unChat->couleur.’ a ses ‘.$unChat->etat.’.'; /// Eh oui, ce petit exemple affichera bien : « Mon chat noir a ses griffes sorti. ». C’est horrible, n’est-ce-pas ? Heureusement avec @@__set()@@ et @@__get()@@, on va pouvoir empêcher ce types d’actions et en profiter pour vérifier le type des valeurs que l’on assigne à nos attributs. Par contre : /// class Chat { } $unChat = new Chat(); $unChat->etreGentils(); /// Nous renverra une jolie petite erreur ! (heu, oui, je n’aime pas tellement les chats. Enfin, cela dit, je n’ai rien contre eux non plus) Heureusement la méthode magique @@__call()@@ va nous permettre de rattraper ce petit bémol. Mais tout cela est très bien expliqué sur [Apprendre PHP|http://www.apprendre-php.com/tutoriels/categorie-6-1-la-programmation-orientee-objet-poo.html], alors sans plus tarder voilà une liste des méthodes et des constantes magiques, ainsi que des fonctions prédéfinies avec à chaque fois une explique, ou des exemples tiré du manuel PHP, de tutoriels sur le Web ou de mes propres mot. !!!Méthodes magiques Plus d’informations dans le [Manuel PHP|http://fr3.php.net/manual/fr/language.oop5.magic.php] (liste tirée de Developpez.com et modifiée, voir agrémentée, par mes soins) *@@__construct()@@ : Appelée lorsqu’on tente de construire la class *@@__destruct()@@ : Appelée lorsqu’on tente de détruire la class *@@__set()@@ : Déclenchée lors de l’accès en écriture à une propriété de l’objet. [Exemple d'utilisation|http://www.apprendre-php.com/tutoriels/tutoriel-49-methodes-magiques-set-et-get.html] *@@__get()@@ : Déclenchée lors de l’accès en lecture à une propriété de l’objet. [Exemple d'utilisation|http://www.apprendre-php.com/tutoriels/tutoriel-49-methodes-magiques-set-et-get.html] *@@__call()@@ : Déclenchée lors de l’appel d’une méthode inexistante de la classe (appel non static). [Exemple d'utilisation|http://www.apprendre-php.com/tutoriels/tutoriel-48-methodes-magiques-call.html] *@@__callstatic()@@ : Déclenchée lors de l’appel d’une méthode inexistante de la classe (appel static) : disponible depuis PHP 5.3 et 6.0 *@@__isset()@@ : Déclenchée si on applique @@isset()@@ à une propriété de l’objet

*@@__unset()@@ : Déclenchée si on applique @@unset()@@ à une propriété de l’objet -> différence avec @@__destruct()@@ ? *@@__sleep()@@ : Exécutée si la fonction @@serialize()@@ est appliquée à l’objet. [Exemple d'utilisation|http://www.apprendre-php.com/tutoriels/tutoriel-75-methodes-magiques-sleep-et-wakeup.html] *@@__wakeup()@@ : Exécutée si la fonction @@unserialize()@@ est appliquée à l’objet. [Exemple d'utilisation|http://www.apprendre-php.com/tutoriels/tutoriel-75-methodes-magiques-sleep-et-wakeup.html] *@@__toString()@@ : Appelée lorsque l’on essaie d’afficher directement l’objet : @@echo $object;@@ *@@__set_state()@@ : Méthode static lancée lorsque l’on applique la fonction @@var_export()@@ à l’objet *@@__clone()@@ : Appelé lorsque l’on essaie de cloner l’objet. [Exemple d'utilisation|http://www.apprendre-php.com/tutoriels/tutoriel-74-methodes-magiques-clone.html] *@@__autoload()@@ : Cette fonction n’est pas une méthode, elle est déclarée dans le scope global et permet d’automatiser les « include/require » de classes PHP !!!Constantes magiques Plus d’informations dans le [Manuel PHP|http://fr3.php.net/manual/fr/language.constants.predefined.php] (je n’ai rien ajouté, ça me paraissait clair) * @@\__CLASS__@@ Le nom de la classe courante. (Ajouté en PHP 4.3.0) Depuis PHP 5, cette constante retourne le nom de la classe comme il a été déclaré (sensible à la casse). En PHP 4, cette valeur est toujours en minuscule. * @@\__METHOD__@@ Le nom de la méthode courante. (Ajouté en PHP 5.0.0) Le nom de la méthode est retourné comme il a été déclaré (sensible à la casse). * @@\__NAMESPACE__@@ Le nom de l’espace de noms courant (sensible à la casse). Cette constante est définie au moment de la compilation (Ajouté en PHP 5.3.0). * @@\__LINE__@@ La ligne courante dans le fichier. * @@\__FILE__@@ Le chemin complet et le nom du fichier courant. Si utilisé pour une inclusion, le nom du fichier inclus est retourné. Depuis PHP 4.0.2, @@\__FILE__@@ contient toujours le chemin absolu pour les liens symboliques alors que les anciennes versions contenaient le chemin relatif, dans certaines circonstances. * @@\__DIR__@@ Le dossier du fichier. Si utilisé dans une inclusion, le dossier du fichier inclus sera retourné. C’est l’équivalent de dirname(@@\__FILE__@@). Ce nom de dossier ne contiendra pas de slash final, sauf si c’est le dossier racine. (Ajouté en PHP 5.3.0.) * @@\__FUNCTION__@@ Le nom de la fonction. (Ajouté en PHP 4.3.0) Depuis PHP 5, cette constante retourne le nom de la fonction comme il a été déclaré (sensible à la casse). En PHP 4, cette valeur est toujours en minuscule. !!!Méthodes prédéfinies Plus d’informations dans le [Manuel PHP|http://fr3.php.net/manual/fr/ref.classobj.php] (je n’ai presque rien ajouté, ça me paraissait clair) * @@class_alias@@ : Créé un alias de la classe * @@class_exists@@ : Vérifie que la classe a été définie * @@get_called_class@@ : Le nom de la classe en « Late Static Binding », c’est la class courante * @@get_class_methods@@ : Retourne les noms des méthodes de la classe * @@get_class_vars@@ : Retourne les valeurs par défaut des attributs de la classe * @@get_class@@ : Retourne la classe de l’objet * @@get_declared_classes@@ : Liste toutes les classes prédéfinies dans PHP * @@get_declared_interfaces@@ : Retourne un tableau avec toutes les interfaces déclarées * @@get_object_vars@@ : Retourne les propriétés de l’objet * @@get_parent_class@@ : Retourne le nom de la classe de l’objet * @@interface_exists@@ : Vérifie si l’interface a été définie * @@is_a@@ : Vérifie si l’objet fait parti de la classe ou a cette classe comme parents * @@is_subclass_of@@ : Détermine si l’objet est une sous-classe * @@method_exists@@ : Vérifie que la méthode existe pour la classe * @@property_exists@@ : Vérifie si un l’objet ou la classe possède un attribut

Vocabulaire à connaître de la POO

Catégorie : PHP objet | 2 commentaires

Voici quelques mots de vocabulaire qu’il peut être utile de connaître pour s’y retrouver en programmation orientée objet. Je complèterai cette liste au fil du temps. (en fonction de mes souvenirs et de mes découvertes) * __Classe__ : Permet de définir la structure d’un objet qui pourra ensuite être utilisé plusieurs fois avec des options différentes, et dupliqué à loisir par le biais de classes filles. Mot clef : @@class@@ * __Instance__ : Une classe définie et chargée. Une instance (un objet) est donc utilisable concrètement, alors qu’une classe. Mot clef : @@new@@ * __Objet__ : Instance d’une classe * __Attribut ou Propriété__ : Variable d’une classe. Mot clefs : @@var@@ ou @@const@@ * __Méthode__ : Fonction d’une classe. Mot clefs : @@function@@ * __Surcharge ou polymorphisme Ad hoc__ : Permet de définir des méthodes avec le même nom et ayant des fonctionnalités similaires (ex : @@afficher()@@, @@supprimer()@@) dans des classes héritant d’une même classe mais n’ayant pas d’autres liens entres elles. On parle ainsi de surcharge d’une méthode lorsque l’on redéfinie une méthode qui avait déjà été définie dans une classe parente. Ex : fonction @@trier()@@ qui fonctionnera pour trier des livres ou des CD sans que le programmeur se souci du nom de la méthode. * __Attribut ou méthode magique__ : Attribut ou méthode commençant généralement par deux underscores (@@__@@) , étant apparu dans PHP 5, et ayant des fonctionnalités impossible à coder « à la main » comme par exemple le déclenchement d’une méthode lors de l’instanciation d’une classe ou la suppression d’une instance. Ex : @@__construct,@@ @@__clone@@, @@__toString@@ * __Méthode prédéfinie__ : Méthode déjà définie par PHP. Ex : @@get_parent_class@@, @@class_exists@@ * __Héritage__ : Notion permettant qu’une classe (dites fille) hérite des attributs et des méthodes d’une autre classe (dites parente). Mot clef : @@extends@@ * __Constructeur__ : Méthode permettant de créer un objet en instanciant une classe. Mot Clef : @@__construct($params)@@ * __Interface__ : Définie une liste de méthodes que doit contenir les classes qui implémentent cette interface. Mot clef : @@interface@@

Utiliser les méthodes et les attributs d’une autre class

Catégorie : PHP objet | Laisser un commentaire

Ah, je viens enfin de mieux comprendre à quoi servait l’opérateur cons @@::@@. Dans le [précédent billet où j'en parlais|/post/2009/operateur-cons-et-les-mots-clef-self-et-parent] je disais qu’il permet de résoudre un attribut ou une méthode, éh bien c’est tout à fait vrai ! * Pour appeler un attribut ou une méthode d’une class dans cette même class, on utilise @@$this->methodeOuAttribut@@. * Pour appeler un attribut ou une méthode d’une class lorsqu’on a instancié cette class, on utilise @@$nomInstance->methodeOuAttribut@@. * Pour appeler un attribut ou une méthode d’une class dans une autre class, on utilise @@NomDeLaClass::methodeOuAttribut@@. Les deux class doivent bien sûr se trouver dans le même fichier, ou on peut inclure l’une dans le fichier de l’autre avec @@include()@@ ou @@require()@@. Dans le cas d’un attribut, si l’on tente d’y accéder avec le nom d’une class, cela signifie que notre attribut doit être __static__, il reste identique pour toutes les instances de cette class. Prêt pour un petit exemple (débile) ? /// ‘; } function saluer_en_langue($langue) { return $langue; } function fr() { return self::$fr; } function de() { return $this->de; } } class Appeler { function dire_bonjour() { echo DitBonjour::saluer(); } function dire_bonjour_en_langue() { echo DitBonjour::saluer_en_langue(DitBonjour::fr()).’
‘; echo DitBonjour::saluer_en_langue(DitBonjour::$en).’
‘; echo DitBonjour::saluer_en_langue(DitBonjour::de()).’
‘; } } $appel = new Appeler(); $appel->dire_bonjour(); $appel->dire_bonjour_en_langue(); ?> /// Ceci renverra : > Guten tag!%%% > Coucou le monde !%%% > Hello world!%%% > __Notice:__ Undefined property: Appeler::$de in __F:\bn\Web\Test\PHPObjet\test2.php__ on line __26__ Donc on voit bien que pour les méthodes il n’y a aucun problème, l’appel se fait très bien. (sauf si on avait rajouté des protected ou private, bref, je vous renvoie vers un [précédent billet|http://30minparjour.la-bnbox.fr/post/2009/la-visibilite-tu-vois]) Lorsqu’il s’agit des attributs… Pour le français, l’attribut $fr est protégé, j’ai donc utilisé un accessor avec @@self::@@ pour avoir la valeur de l’attribut pour cette class (ce qui oblige la staticité) : pas de problème. Mais l’anglais est la preuve que l’on peut aussi accéder directement à l’attribut s’il est en accès public. Quant à l’allemand, il renvoie une erreur puisque le @@$this->@@ implique que l’appel va chercher l’attribut $de dans la class Appeler, il n’existe pas, donc une erreur est renvoyé. Bon, j’avoue que j’ai encore du mal à saisir les subtilités entre self, parent et $this, (ça parait pourtant tellement simple en théorie), mais encore quelques petits exemples, voir quelques petits tests, et ça devrait être bon :D

La visibilité tu vois…

Catégorie : PHP objet | Laisser un commentaire

Je viens de découvrir un nouveau tutoriel sur la [POO en PHP|http://www.apprendre-php.com/tutoriels/categorie-6-1-la-programmation-orientee-objet-poo.html] sur le site [Apprendre PHP|http://www.apprendre-php.com/]. Le site est bien joli, et le tutoriel est bien expliqué. L’auteur s’est donné la peine de donner de nombreux exemples, et c’est ce qui rend ce tutoriel encore plus intéressant à mon sens. Dans un précédent [billet|/post/2009/apparition-de-la-visibilite-de-methodes-predefinies-en-php-5], j’avais expliqué l’utilisation des mots clés private, protected et private, mais avec ce tutoriel, je viens d’apprendre que cette notion s’appelle la __visibilité d’attributs ou de méthodes__. !!!Petit rappel sur la visibilité * __public__ (valeur par défaut) : l’attribut ou la méthode ainsi défini pourra être utilisé par n’importe qui. * __protected__ : l’attribut ou la méthode ainsi défini ne pourra être utilisé que dans la @@class@@ parente et ses dérivées (bref, celles qui en héritent quoi). * __private__ : l’attribut ou la méthode ainsi défini ne pourra être utilisé que dans la @@class@@ parente. Un petit exemple d’utilisation : /// class MaClass { public $var1; public function fonction() { echo ‘Coucou’; } } /// Et une petite erreur renvoyé si on utilise un attribut ou une méthode protégée ou privée à mauvaise escient : ///[apache] Fatal error: Cannot access private property NomClass::$attribut in /path/to/Apprendre-php/magic_methods.php on line X. /// !!!Modifier la valeur d’un attribut protégé ou privé : mutator On a parfois de modifier un attribut à l’extérieur d’un objet, et si ce dernier est protégé (@@protected@@) ou privé (@@private@@), eh bien on ne peut le modifier ainsi. La combine consiste à utilise le __mutator__ qui est une méthode dont le rôle est de modifier la valeur de tel ou tel attribut. En général on nomme ce mutator : @@setNomAttribut()@@. /// class MaClass { private $var1; public function setVar1($var1) { $this->var1 = $var1; } } /// !!!Lire la valeur d’un attribut protégé ou privé : accessor De la même manière, si on souhaite lire la valeur d’un attribut protégé (@@protected@@) ou privé (@@private@@) à l’extérieur de tout objet, il faut utiliser un __accessor__ : une méthode dont le rôle est de lire la valeur d’un attribut. En général, on nomme cet accessor : @@getNomAttribut()@@. /// class MaClass { private $var1; public function getVar1($var1) { return $this->var1; } } /// !!!Conclusion Voilà, ce que j’avais oublié est désormais corrigé ^^ C’est très bien expliqué sur le cours d’Apprendre PHP. Certains conseillent de créer des accessor pour tous les types d’attributs, on peut ainsi appliquer tous les traitements que l’on souhaite avant de récupérer un attribut ce qui est plutôt pratique et évite de modifier son code par la suite. Dans ce cas, il est judicieux d’oublier le petit « get », ainsi si notre attribut se nomme chameau, notre accessor se nommera chameau().

Interfaces : plus utiles qu’il n’y parait

Catégorie : PHP objet | Laisser un commentaire

C’est en regardant le détails des interfaces prédéfinies sur le [Manuel PHP|http://fr2.php.net/manual/fr] que j’ai mieux compris l’interêt des Interfaces. Prenons comme exemple l’interface [Traversable|http://fr2.php.net/manual/fr/class.traversable.php] : elle signifie que les class l’implétant doivent pouvoir parcourir des objets avec @@foreach@@. Pour cela, il faut que les class en question implémente, par exemple, l’interface prédéfinie [Iterator|http://fr2.php.net/manual/fr/class.iterator.php] qui définie les itérateurs. Ces itérateurs doivent pouvoir utiliser les fonctions @@rewind@@ (retour arrière), @@next@@ (au suivant), @@current@@ (position actuelle), etc… Et le manuel nous montre des exemples d’implémentations de ces interfaces. En somme, j’ai envi de dire que les interfaces sont aux class ce que sont les types aux variables en programmation « classique ». Un peu quoi… En structurant sa manière de programmer (en utilisant des types et/ou des interfaces) on diminue le risque d’erreurs ou de bugs, on améliore la lisibilité, la relecture et la réutilisation du code et ça :, c’est quand même tout l’enjeu d’un code durable !!! Ah, il est à noter qu’une interface peut hériter d’une autre. L’interface Iterator hérte de Traversable par exemple, et si on devait la créer, on écrirait : /// /// Même syntaxe qu’avec les class quoi ^^ Et une class peut aussi implémenter plusieurs interfaces, alors pour faciliter l’écriture, il est possible de séparer les interfaces par des virgules : /// /// Comme toujours, le Manuel PHP m’aura été d’une grande aide ! Je l’utilise beaucoup pour le procédural (la programmation non objet quoi), j’aurai dû y penser plus tôt pour l’objet ! –Je me demande s’il est possible de définir une class qui hérite de plusieurs autres class en les séparant par des virgules. En théorie oui.– Une class ne peut hériter de plusieurs class, bref l’héritage multiple est impossible en PHP, mais l’interfaçage multiple est possible en PHP. (ça, c’est dit ^^) Cela dit, une class ne peut pas implémenter deux interfaces partageant des noms de méthodes.

Interface, les Mousquetaires sont toujours de la partie

Catégorie : PHP objet | Laisser un commentaire

Je n’ai pas encore bien saisi l’interêt des Interfaces dans la POO. Si je comprend bien, une interface liste toutes les méthodes qui doivent impérativement connaitre les class si elles veulent implémenter cette Interface. Pour moi, cela permet de structurer légérement le code (si on a plusieurs class qui implémentent une Interface, il suffit d’aller voir cette Interface pour connaitre toutes les méthodes importantes), et … bah franchement, non, je ne vois pas. On créé une Interface avec le mot clé @@interface@@ ! Facile jusqu’ici ^^ Puis il reste à préciser qu’une class l’implémente avec le mot clé @@implements@@. /// /// Des Interfaces sont prédéfinies en PHP, et il est possible de les connaitre à l’aide du code suivant : /// /// Qui affichera : /// Traversable [1] => IteratorAggregate [2] => Iterator [3] => ArrayAccess [4] => reflector [5] => RecursiveIterator [6] => SeekableIterator ) ?> /// Il existe aussi des class prédéfinies : /// /// Qui affichera : /// stdClass [1] => __PHP_Incomplete_Class [2] => Directory ) ?> ///

Constructeur et notion d’héritage

Catégorie : PHP objet | Laisser un commentaire

Continuons avec les bases en nous intéressant au constructeur et à la notion d’héritage. !!!!Constructeur Dans mon dernier billet, je me suis amusé à remplir mes attributs à la main, pourtant, en utilisant un constructeur, tout serait bien plus simple. Un constructeur est une méthode qui a le même nom que la class. Elle prend en paramètre les attributs que l’on souhaite remplir. /// nom = $nom; $this->description = $description; } function ajouter_billet() { echo ‘Ceci est mon premier billet pour blog ‘.$this->nom.’.
‘; } function ajouter_categorie() { echo ‘Ceci est ma première catégorie pour blog ‘.$this->nom.’.
‘; } } $blogDeBN = new Blog(’30 minutes par jour’, ’30 minutes par jour au coeur de l\’informatique.’); // On peut afficher les attributs echo ‘Nom du blog : ‘.$blogDeBN->nom.’
‘; echo ‘Description du blog : ‘.$blogDeBN->description.’
‘; echo ‘Url du blog : ‘.$blogDeBN->url.’
‘; // On utilise les méthodes $blogDeBN->ajouter_billet(); $blogDeBN->ajouter_categorie(); ?> /// !!!!Attribut objet En PHP objet, il est tout à fait possible de créer un attribut qui sera un objet (une instance d’une class), tout comme cet attribut aurait pu être un int, un string, … Il nous faudra donc utiliser deux sélécteurs flêches @@->@@ pour accéder aux attributs de cet objet. /// nom = $nom; $this->description = $description; } } class Blog { var $nom; var $description; var $categorie; var $url; function Blog($nom, $description, $categorie) { $this->nom = $nom; $this->description = $description; $this->categorie = $categorie; } function ajouter_billet() { echo ‘Ceci est mon premier billet pour blog ‘.$this->nom.’.
‘; } function ajouter_categorie() { echo ‘Ceci est ma première catégorie pour blog ‘.$this->nom.’.
‘; } } // — Un attribut peut être un objet $catCMS = new Categorie(‘CMS’, ‘Quelques lignes sur les CMS’); $blogDeBN = new Blog(’30 minutes par jour’, ’30 minutes par jour au coeur de l\’informatique.’, $catCMS, ‘http://30minparjour.la-bnbox.fr’); // On peut afficher les attributs echo ‘Catégorie : ‘.$catCMS->nom.’
‘; echo ‘Description de la catégorie : ‘.$catCMS->description.’

‘; echo ‘Nom du blog : ‘.$blogDeBN->nom.’
‘; echo ‘Description du blog : ‘.$blogDeBN->description.’
‘; echo ‘Catégorie du blog : ‘.$blogDeBN->categorie->nom.’
‘; echo ‘Description de la catégorie : ‘.$blogDeBN->categorie->description.’
‘; echo ‘Url du blog : ‘.$blogDeBN->url.’

‘; // — Un attribut peut aussi être une instance de la même classe que son objet parent $catDotclear = new Categorie(‘Dotclear’, ‘Parlons de Dotclear’); $catCMS->sousCat = $catDotclear; // On affiche les attributs echo ‘Catégories du blog : ‘.$blogDeBN->categorie->nom.’ / ‘.$blogDeBN->categorie->sousCat->nom.’
‘; echo ‘Description de la catégorie : ‘.$catCMS->sousCat->description.’
‘; ?> /// !!!!Notion d’héritage On peut aussi construire des class qui hériteront des attributs et méthodes d’une autre classe. Prenons un exemple. Un blog photo est bien un blog, il a bien un nom, une description, un url, on peut ajouter un billet ou une catégorie. Mais il serait assez pratique de pouvoir préciser aussi le nombre de photos qu’il contient, ou alors une méthode pour ajouter une photo, … tout un tas de choses qu’un blog classique n’a pas besoin. Au lieu de réécrire deux class grandement similaire, on va dire que la class BlogPhoto va hériter de tous les attributs et méthodes de la class Blog grâce au mot clé @@extends@@. /// nom = $nom; $this->description = $description; } function ajouter_billet() { echo ‘Ceci est mon premier billet pour blog ‘.$this->nom.’.
‘; } function ajouter_categorie() { echo ‘Ceci est ma première catégorie pour blog ‘.$this->nom.’.
‘; } } class BlogPhoto extends Blog { var $nbDePhoto; function ajouter_photo() { echo ‘J\’ajoute une magnifique photo…’; } } $blogDeBN = new Blog(’30 minutes par jour’, ’30 minutes par jour au coeur de l\’informatique.’); $blogPhoto = new BlogPhoto(‘Mes photos’,  »); $blogPhoto->nbDePhoto = ’10′; // On peut afficher les attributs echo ‘Nom du blog de BN : ‘.$blogDeBN->nom.’
‘; echo ‘Description du blog de BN : ‘.$blogDeBN->description.’
‘; echo ‘Nb de photos du blog de BN (erreur) : ‘.$blogDeBN->nbDePhoto.’
‘; echo ‘Nom du blog photo : ‘.$blogPhoto->nom.’
‘; echo ‘Description du blog Photo : ‘.$blogPhoto->description.’
‘; echo ‘Nb de photos du blog Photo : ‘.$blogPhoto->nbDePhoto.’
‘; $blogPhoto->ajouter_photo(); ?> /// Si je redéfinis un attribut ou une méthode dans ma class BlogPhoto, cet attribut ou cette méthode sera réécris et ce n’est plus celui de la class Blog qui sera utilisé. Bon, fini pour ajourd’hui. Le cours sur Developpez.com a l’air bien complet et plutôt bien expliqué. Par contre, j’ai cru comprendre que PHP 5 avait amené son lot de nouveautés et que du coup mes 2 derniers billets sont peut-être obsolètes. Il existe par exemple un mot clé @@__construct@@ pour le constructeur. Bref, je vais lire ce cours et je pourrai en dire plus à ce moment là !

Introduction au PHP objet (class, objet, attribut, méthode)

Catégorie : PHP objet | Laisser un commentaire

Premier jour sur la programmation orientée objet (POO) en PHP. Nous allons voir ce qu’est un objet et donc détailler toutes ces histoires de class, attribut, méthode et objet. A l’assaut ! !!!!Class, attribut et méthode __En PHP, un objet est en fait une instance d’une class__. Par exemple, on peut créer une class Blog qui représente les blogs de manière générique en décrivant par exemple le nom d’un blog, sa description rapide… Ce sont ses attributs. Cette class pourrait aussi permettre d’écrire un nouveau billet, ou d’ajouter une catégorie. Ce sont ses méthodes. A partir de là, on va pouvoir instancier cette class Blog afin de définir les objets blogs de Jean-François, blog photos d’Agnés, etc… Si on résume : * __class__ : objet générique contenant des attributs et des méthodes. Le nom d’une class commence en général par une majuscule. Définie par le mot clef class. * __attribut__ : variable d’une class. Définie par le mot clef @@var@@, @@const@@ ou rien du tout. * __méthode__ : fonction d’une class. Définie par le mot clef @@function@@. * __objet__ : instance d’une class. Définie par le mot clef @@new@@. Maintenant, nous allons créer une class Blog avec ses différents attributs et méthodes. /// ‘; } function ajouter_categorie() { echo ‘Ceci est ma première catégorie.
‘; } } ?> /// Reste à l’instancier avec le mot clé @@new@@ pour pouvoir l’utiliser. On accédera aux attributs et aux méthodes à l’aide du sélecteur flêche @@->@@. Toutefois, on ne peut pas accéder aux constantes avec le sélecteur flêche, par contre avec le sélecteur cons @@::@@, pas de problème : @@MaClass::CONSTANTE@@. En général, on nomme les constantes tout en majuscule. /// nom = ’30 minutes par jour’; $blogDeBN->description = ’30 minutes par jour au coeur de l\’informatique.’; $blogDeBN->url = ‘http://30minparjour.la-bnbox.fr’; // On peut les afficher echo ‘Nom du blog : ‘.$blogDeBN->nom.’
‘; echo ‘Copyright : ‘.Blog::COPYRIGHT.’
‘; // On utilise les méthodes $blogDeBN->ajouter_billet(); $blogDeBN->ajouter_categorie(); // On peut aussi en créer un autre $blog = new Blog(); $blog->nom = ‘Un blog’; $blog->ajouter_billet(); $blog->ajouter_categorie(); echo ‘Nom du blog : ‘.$blog->nom.’
‘; echo ‘Copyright : ‘.Blog::COPYRIGHT.’
‘; // Mais le nom du blog de BN n’a pas changé echo ‘Nom du blog de BN : ‘.$blogDeBN->nom.’
‘; ?> /// Pour appeler un attribut à l’intérieur d’une méthode, on utilisera @@$this->attribut@@, affin de préciser que l’on parle de l’attribut que l’on utilise actuellement. (et non de celui d’un autre objet que l’on aurait pu instancier. /// nom.’.
‘; } function ajouter_categorie() { echo ‘Ceci est ma première catégorie pour blog ‘.$this->nom.’.
‘; } } $blogDeBN = new Blog(); // On remplie les attributs $blogDeBN->nom = ’30 minutes par jour’; $blogDeBN->description = ’30 minutes par jour au coeur de l\’informatique.’; $blogDeBN->url = ‘http://30minparjour.la-bnbox.fr’; // On peut les afficher echo ‘Nom du blog : ‘.$blogDeBN->nom.’
‘; // On utilise les méthodes $blogDeBN->ajouter_billet(); $blogDeBN->ajouter_categorie(); ?> /// Je suis en pleine recherche d’un tutoriel ou d’un livre sur le PHP objet. Pour l’instant j’ai lu l’[introduction à la POO|http://www.siteduzero.com/tutoriel-3-115140-introduction-a-la-poo.html] sur le tutoriel de PHPCake du [Site du Zéro|http://siteduzero.com], et je vais voir ce que donne les autres cours que j’ai pu trouver comme celui sur [Developpez.com|http://g-rossolini.developpez.com/tutoriels/php/cours/?page=poo#LIV].