PHP Objet (fct magiques "__" , interfaces, this/se

jamesbond69
Invité n'ayant pas de compte PHPfrance

07 oct. 2005, 08:54

Bonjour,

je viens de ma mettre au php objet et bien que connaissant un peu les concepts, différents point m'échappent.

Tout d'abord l'utilisation des mots clés "this->" par rapport à "self::" et "super->" par rapport à "parent::". Dans quel cas utiliser l'un plus que l'autre ?

Ensuite malgré certains exemples, je ne comprends pas l'utilité des interfaces.

Enfin, pourquoi utiliser les fonctions dites magiques du type __toString() ou __autoLoad(). Soit ces fonctions ont un nom bien précis que php connait auquel cas le développeur n'a pas à les redévelopper. Soit le contenu de ces fonctions est inconnu de php et le développeur peut les créer de toutes pièces, mais libre à lui d'utiliser le nom de fonction qu'il désire. (Ex : quelle différence d'utiliser __construct() ou d'appeler la méthode créée par le développeur portant le même nom que la classe).

Suis-je assez claire ?

Merci de vos réponses.[/b]

Eléphant du PHP | 493 Messages

09 oct. 2005, 11:35

bonjour.
effectue quelques bench et tu verras que l'utilisation de parent: ou de self:: se revèle plus couteuse que this-> !

mais alors quel est l'interet de self et de parent ?!
  • self permet d'appeler des propriétées statiques et est utilisé le plus souvent dans ce cas.
  • parent peut etre utile si tu as une methode definie dans une classe fille et une classe mère. en appelant parent::la_fonction, tu executes les 2 fonctions, à la place de seulement les fonctions de la classe fille.
personnellement je ne vois pas l'interet de __autoload(). je trouve qu'il est mieux d'appeler soit meme ses objets.

je ne vois pas non plus l'interet de __tostring() mais je le comprend ! c'est tout simplement pour les fénéants ! il remplace
$obj = new obj( 'yop' );
echo $obj->ma_propriete_principale;
et permet par exemple d'afficher directement ma_propriete_principale ... oui un peu confus mais bon ... la fonction est un peu inutile :)

pour ce qui est de __construct(), je suis pleinement pour ! pourquoi appeler une fonction avec le meme nom que la classe ?! de plus si tu suits une convention de codage, il n'est pas rare que le nomage des class et des fonctions differe.

j'espere t'avoir un peu éclairé

Mammouth du PHP | 19672 Messages

09 oct. 2005, 12:03

je ne vois pas non plus l'interet de __tostring() mais je le comprend ! c'est tout simplement pour les fénéants !
:shock: À ce compte là, l'informatique, c'est aussi pour les fainéants: ça évite d'avoir à utiliser un papier et un crayon et de faire des calculs à la main... :-k

Je conçois cette interprétation sur de petites applications, mais sur un projet un tant soit peu volumineux et complexe, ça prend une toute autre importance. __autoload simplifie considérablement le code, ça permet justement de ne pas avoir à se soucier de faire les inclusions de fichier soi-même et de ne rien inclure inutilement non plus: ça fait un code plus propre en ne chargeant que les classes nécessaires quand elles sont invoquées. Ce n'est pas de la fainéantise, c'est de l'optimisation.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 281 Messages

09 oct. 2005, 12:35

Bonjour,

A vrai dire moi je vois quand même l'utilité de __autoload m'enfin comme quoi ça dépend vraiment des utilisateurs.

Par contre comme JamesBond69, quelqu'un saurait il ou aurait il un lien qui explique l'utilité des interfaces et des implémentations car je n'arrive pas très bien à comprendre le principe et l'utilité.

Ps : Aussi l'utilité de __toString en PHP est "seulement" de renvoyer un texte défini si on imprime directement un objet ? Car en JAVA ça sert essentiellement à forcer le format d'un objet en String afin de pouvoir l'afficher.

Merci d'avance :wink:

@+

jamesbond69
Invité n'ayant pas de compte PHPfrance

09 oct. 2005, 12:54

pour ce qui est de __construct(), je suis pleinement pour ! pourquoi appeler une fonction avec le meme nom que la classe ?! de plus si tu suits une convention de codage, il n'est pas rare que le nomage des class et des fonctions differe.
D'accord c'est un point de détail, mais depuis l'apparition des languages objet une fct portant le même nom que la class s'appelle fct constructeur. (c++, java....) et a la même utilité que __construct. Donc pourquoi modifier ce concept en php avec l'insertion d'une nouvelle fct qui pour moi est inutile et de plus et complexifie encore (car ce n'est pas le seul cas) la conception objet.

Mammouth du PHP | 19672 Messages

09 oct. 2005, 13:03

Un point m'échappe : en quoi trouves-tu que ça rend la POO plus complexe d'utiliser un nom unique pour un constructeur ou un destructeur ? Il me semble personnellement au contraire que ça simplifie. On ne risque pas de faire des erreurs de recopie de nom, on sait que le constructeur s'appelle __construct et basta. Ce n'est pas un problème. Ce qui en devient un en revanche, c'est de maîtriser les concepts objets et de savoir comment organiser l'achitecture d'un ensemble de classe. Alors là oui, ça vaudrait la peine de faire un débat.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

jamesbond69
Invité n'ayant pas de compte PHPfrance

09 oct. 2005, 14:30

Je voulais juste souligner que pour faire la même chose, ont utilise plusieurs fonction : __construct OU fct constructeur. Quelle utilité ?

C'est en cela que je trouve inutile de se disperser à intéger à un langage plus de fonction qu'il n'est necessaire.

C'est comme la fct __set, pour moi quel intéret d'avoir intégrer cette fonction à php, plutot que de faire une simple affectation de variable. $variable="valeur";

Mais peut être que je m'explique mal.

Mammouth du PHP | 1885 Messages

09 oct. 2005, 18:22

Tu sembles ne pas avoir de notion de programmation orientée objet.

Un constructeur unifié permet de simplifier l'héritage et de ne pas avoir à renommer le constructeur dès qu'on change le nom de la classe.

De plus la fonction __set() est utilisé pour implanter le "accessor". L'affectation direct des propriétés de classe n'est pas recommandé puisque lorsque tu auras à réaliser un traitement spécial avant de récupérer celle-ci, tu devras revoir tous tes scripts alors qu'avec une méthode accessor, tu n'as qu'à ajouter le traitement sans revoir tes scripts.
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

jamesbond69
Invité n'ayant pas de compte PHPfrance

09 oct. 2005, 20:36

Pourtant si, mais seulement pour les concepts généraux. En tout cas, merci pour toutes vos réponses. Je vais essayer de me débrouiller avec ça.

Invité
Invité n'ayant pas de compte PHPfrance

10 oct. 2005, 07:03

Euh personne ne pourrait m'aider pour ma question posé un peu plus haut ? :o

Eléphant du PHP | 281 Messages

10 oct. 2005, 07:03

Oups désolé sacré connexion...

Mammouth du PHP | 19672 Messages

10 oct. 2005, 08:34

Si on revient à ta question, sauf erreur il s'agit de définir l'intérêt des interfaces :
Une interface permet de s'assurer qu'un certain nombre de classes implémentent bien un certain nombre de méthodes. On les utilisera par exemple pour un ensemble de classes d'accès aux données. Exemple : on crée une couche d'abstraction pour accéder aux données indépendante du SGBD utilisé. On créera une interface qui définira les méthodes qui seront ensuite implémentées dans chacun des classes spécialisées, c'est à dire que autant pour MySQL que pour Oracle,, MS_Access, SQL-Server, SQLire, etc, etc... on aura dans chacune de ces classes les mêmes méthodes mais elles contiendront un code spécifique au SGBD.

C'est bien sûr une question sommaire, mais il est difficile de s'étaler. Je te recommande de trouver un bouquin sur la POO ou encore PHP5 Avancé où tu trouveras un chapitre qui est consacré au sujet.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 396 Messages

10 oct. 2005, 15:01

__autoload simplifie considérablement le code, ça permet justement de ne pas avoir à se soucier de faire les inclusions de fichier soi-même et de ne rien inclure inutilement non plus: ça fait un code plus propre en ne chargeant que les classes nécessaires quand elles sont invoquées. Ce n'est pas de la fainéantise, c'est de l'optimisation.
Au sujet de cette fonction, j'aurais voulu avoir une precision svp.
A ce que j'ai compris si je fais un new maClasse(), cela va inclure tout seul le fichier maClasse.php et a priori on a plus à se soucier des inclusions.
Mais où PHP va-t-il chercher le fichier de la classe? Dans le même dossier que le fichier en cours ou cherche-t-il dans tous les dossiers? On peut peut-être paramètrer le dossier de stockage des classes?

Merci d'éclairer ma lanterne :)

Eléphant du PHP | 281 Messages

10 oct. 2005, 19:41

Cyrano > Merci, j'vais approfondir ça dès que j'ai un peu de temps.

Rei Itchido > Oui on peut paramétrer :

http://fr.php.net/__autoload

@+

Eléphant du PHP | 70 Messages

10 oct. 2005, 20:01

pour ce qui est de __construct(), je suis pleinement pour ! pourquoi appeler une fonction avec le meme nom que la classe ?!
Cette question ne se pose pas en PHP pour le moment puisqu'on ne peut pas surcharger les constructeurs (ni les méthodes) directement. Si PHP l'autorise un jour, le constructeur "magique" disparaîtra progressivement . Étant donné qu'on peut nommer les fichiers et classes comme on veut en PHP, ce constructeur "magique" (et les méthodes __set() et __get()) est pratique pour régler les problèmes de compatibilité au moins pour ceux qui ont fait de l' "objet" en PHP 4 en nommant leurs fichiers, classes et méthodes sans convention ou avec une mauvaise convention puisque ces méthodes "magiques" sont "héritées".
Ps : Aussi l'utilité de __toString en PHP est "seulement" de renvoyer un texte défini si on imprime directement un objet ? Car en JAVA ça sert essentiellement à forcer le format d'un objet en String afin de pouvoir l'afficher.
Bah en PHP c'est pareil, le but c'est d'obtenir une représentation d'un objet sous la forme d'une chaîne de caractères.