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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : PHP Objet (fct magiques "__" , interfaces, this/se

par sadeq » 12 déc. 2005, 15:13

Pour revenir à la construction d'un objet :
la fonction _construct n'est pas une invention de PHP5 mais un commencement vers l'alignement avec les modèles objets de C et JAVA.
C utilisait un "construct" unique pour qualifier la classe à initialiser et charger en mémoire dans un objet.
C et Java permettent aussi de diversifier les point de construction en utilisant des fonctions de construction ayant le même nom que la classe mais qui respectent le concept de surcharge (pool de même fonctions avec des paramètres différents) ainsi le programmeur peut personnaliser l'initialisation de l'objet.
Par exemple (en JAVA):

Code : Tout sélectionner

class machin { //Constructeur de base public machin () { //initialisation sans paramètrage } public machin (int paramètre1) { //initialisation avec 1 paramètre } .... //Autant de machin constructeurs souhaité }
Le constructeur de base est solicité dans l'instanciation suivante :
machin truc = new machin();

Le constructeur à 1 paramètre est appelé par l'instanciation suivante :
le_machin_à_propriété1 = new machin(1);

Les constructeurs paramètrables permettent d'initialiser un certain nombre de propriétés de l'objet au moment de sa création pour simplifier la programmation.

En ce qui concerne, _ToString() et les Interfaces :
elles sont utilies pour les programmeurs qui travaillent en groupe ou sur une série de versions dont la compatibilité exige de respeter un standard.

_ToString :
  • peut être utilisée pour afficher la documentation de la classe (son mode d'emploi)
Les interfaces
  • spécifient un certain nombre de fonctions dont les signatures sont fixées par le cahier des charges. Fonctions que doivent respecter toutes les classes qui utilisent ces interfaces. On parle d'implémentation de fonctionnalités pédéfinies.
    Les interfaces comme leurs noms l'indique permettent de connecter plusieurs classes (les rendre compatibles)

    Exemple :
    Une interface evenementielle qui fixent les fonctions nécéssaires pour gérér le clavier et la souris dans un programme de dialogue H/M
    Pour simplifier le développement toutes les classes conversationnelles doivent implémenter cette interface et décrire le comportement attendu des ses fonctions.
    Ces classes s'entendent alors sur un même jargon de fonctions evennementielles comme CLICK(int X, int Y,...), DBLCLICK(int X, int Y,...), KEYPRESS(int KEYCODE), MOUSEMOVE(int X, int Y,...) ....

    Ceci dit, toute classe qui implémente des interfaces, doit écrire le contenu fonctionnelle des fonctions héritées. Ce qui est normal puisqu'une interface partage seulement les signatures des fonctions.
    On dit que les interface sont des classes abstraites où les fonction ne sont pas directement exécutables.

    Par-ailleurs, les interfaces permettent de mettre en oeuvre l'héritage multiple. Puisqu'une classe n'hérite que d'une seule super-classe mais peut hériter de plusieurs interfaces.

par Ouaibou » 12 déc. 2005, 13:54

Et pour information vu que personne ne l'a apparemment indiqué :

super sert à faire appel à l'objet mère dans le cas d'un héritage (c'est comme this sauf que t'accède aux champs, méthodes et constructeurs de classe dont hérite ta classe fille).

par Rei Itchido » 10 oct. 2005, 23:26

Merci pour l'explication.
Hyper pratique en effet :)

par Cyrano » 10 oct. 2005, 20:27

Pour répondre à Rei Itchido, voici comment on procède:
function __autoload($classe)
{
	include("../classes/".$classe.".php");
}
Si tu utilises un système de pseudo-frames par exemple, tu mets ça en haut de ta page index et tu t'inquiètes plus du reste, tu passes directement aux instanciations.

Condition de fonctionnement: tes fichiers contenant les classes doivent avoir impértivement le même nom que la classe elle-même. Donc une classe maclasse sera enregistrée dans un fichier maclasse.php

par Liquid » 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.

par Ouaibou » 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

@+

par Rei Itchido » 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 :)

par Cyrano » 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.

par Ouaibou » 10 oct. 2005, 07:03

Oups désolé sacré connexion...

par Invité » 10 oct. 2005, 07:03

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

par jamesbond69 » 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.

par Xenon_54 » 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.

par jamesbond69 » 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.

par Cyrano » 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.

par jamesbond69 » 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.