Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/01/2007, à 12:20

glattering

[PHP] Objet, jusqu'à quel point?

Bonjour à tous!
Après plusieurs années, je me suis (re)mis au PHP (et MYSQL), mais je débute en orienté objet et après la lecture de nombreux tutoriaux, je me rends compte que quelque chose me manque afin de bien comprendre.
Je n'ai pas trouvé de méthodologie sur la conception objet! Du coup je m'y perds un peu.

Voilà où j'en suis:
- J'ai créé une classe mysqlbase avec comme mémthode connexion, déconnexion et exécuter une requête.
- J'ai une classe requete, avec un statut (effectuée, erreur etc) et le contenu de la requête, et une mémthode d'exécution de la requete (qui fait appel a la methode de mysqlbase)
- une classe resultat de la requete, avec des méthodes pour parcourir le resultat (ligne suivante, précédente, etc).

- une classe contact (je fais un annuaire), qui contient des champs classiques (nom, prenom etc)


déjà, à ce stade là, j'ai du mal à voir quels objets créer et quels objet peuvent être réunis en un seul. Requete et Resultat par ex. Je les ai séparé car je trouvais que sinon il y aurait trop de méthodes pour une seule classe et surtout des méthodes avec des buts différents, mais c'est plus du feeling qu'autre chose, alors ma question: y a t-il un moyen simple de bien repartir/définir les différentes classes?

Bon, avec ce mic mac, j'arrive a créé un contact, à me connecter à la base et l'ajouter, ou encore à récupérér la liste des contacts depuis la base, ça marche bien, au delà de l'aspect propre du code.

Une autre intérrogation: pour l'affichage.
Car pour l'instantl'affichage est une simple fonction.
Pour passer en objet intelligemment, quel est l'idée? comment faire?
Je créé une classe page? une classe menu? sous menu? et tableau?
pour les listes déroulante dans les formulaires, faut il pousser jusqu'à créer une classe liste, et puis par ex our avoir une liste des mois, créer une classe mois extends liste, avec ue variable contenant déjà tout le code html et une methode gethtml? ou alors un champ value un champ affichage etc.
Comme vous pouvez les voir, je suis un peu perdu à ce niveau là!

Si vous avez des liens définissants une méthodologie intelligente pour faire de l'objet en php, ou bien si vous avez des conseils, ou alors une méthodologie perso, je suis preneur!!

Encore merci d'avoir lu jusqu'au bout!

/glattering, des p'tites classes, des p'tites classes, toujours des p'tites classes...


Membre de l'APRIL - « promouvoir et défendre le logiciel libre » -

Hors ligne

#2 Le 26/01/2007, à 14:44

Bzh

Re : [PHP] Objet, jusqu'à quel point?

Je ne suis pas sur que l'utilisation des classes en php soit réellement intéressante !

Le concept même de la programmation web ne demande pas toute la puissance que peut apporter la programmation en orienté objets.

Au delà de ça, vient le problème de l'économie des ressources du serveur ! Et c'est là que cela coince ! L'utilisation de classes demande beaucoup plus de cpu. Il suffit de regarder les différents bench que l'on peut trouver sur le net la dessus !

Un code bien construit en utilisant simplement des fonctions permet de gagner énormément en cpu que l'utilisation de classes.

Les classes sont intéressantes lors de gros projets en langages compilés et non en langage interprété comme l'est PHP !

Maintenant ce n'est que mon point de vu !

Hors ligne

#3 Le 26/01/2007, à 15:03

glattering

Re : [PHP] Objet, jusqu'à quel point?

Bzh, merci pour ton commentaire.
Je m'étais orienté vers l'objet pour 2 raisons principales (plus ou moins discutables wink):
- mon apprentissage personnel surtout
- un soucis de modularité et donc de facilité de mise à jour du code

Il me semble cependant que php5 soit un langage compilé, mais peut être que je me trompe.

Merci.


Membre de l'APRIL - « promouvoir et défendre le logiciel libre » -

Hors ligne

#4 Le 26/01/2007, à 15:04

Nicolas2b

Re : [PHP] Objet, jusqu'à quel point?

Salut,

Moi je trouve au contraire les classes PHP très interressantes.
Tout d'abord, si tu veux bien faire de la POO ( prog orienté objet ) en PHP, il faut imperativement que tu soit en PHP5.

Je vais t'expliquer comment je procede ( ce qui me parait bien au vue de ce que tu veux faire ).

J'utilise un pattern appellé 'Active Record', cette façon de faire dit que pour ( presque ) chaque table de ta base, il correspond une classe. ( un très bon tuto ici : http://qwix.media-box.net/index.php/2006/01/29/142-ActiveRecordAvecPhp5 )

Ainsi, si tu as une table personne avec le nom, prenom..., tu auras une classe 'Personne' comprenant en attributs les champs de la table, un constructeur qui soit crée un nouvelle personne, soit recupere les infos depuis la base.

Pour la base, crée un classe 'MySQL' qui effectue diverse opération : tout d'abord la connection, mais aussi, les requete d'ajout, de selection, de suppression.
Cette classe peut être en singleton ( un autre pattern tongue ), va voir ici pour mieu comprendre : http://qwix.media-box.net/index.php/2004/09/29/24-LeSingletonEnPhp5

Tout cela c'est pour le code brut.


Pour ce qui est de l'affichage, tu as deux solution : le géré directement, ainsi si tu as une liste de nom par exemple, tu boucles dessus et crée les <td> ou les <select> à la volée, ou bien faire ca à partir d'une classe.
Perso, je n'ai pas de préférences

J'espere que j'ai été le plus clair possible.
Si tu ne m'as pas bien compris demande moi smile

Nicolas.

Edit : le PHP n'est PAS compilé, il est interprété par le serveur

Dernière modification par Nicolas2b (Le 26/01/2007, à 15:06)


Ubuntu Gutsy sur ASUS A6JA Q016H
2 Go de RAM
ATI X1600
Core Duo 1,8 GHz

Hors ligne

#5 Le 26/01/2007, à 15:13

glattering

Re : [PHP] Objet, jusqu'à quel point?

merci Nicolas2b pour les tutos, je vais voir ça illico!

Tout d'abord, oui j'ai installé php5!

Pour ce qui est d'une classe par table dans Mysql, oui, c'est à peu près ce que j'ai fait:
Une table Contact -> une classe Contact
Une table Residence -> une classe Residence
Une table habite (associe une ou plusieurs residences à un contact) -> pas de classe, mais un champs dans la classe Contact qui est un tableau contenant plusieurs objets Residence.

Pour l'affichage, je n'ai pas très bien compris "gérer directement" et le "à partir d'une classe", peux tu détailler?

Encore merci.


Membre de l'APRIL - « promouvoir et défendre le logiciel libre » -

Hors ligne

#6 Le 26/01/2007, à 15:17

Bzh

Re : [PHP] Objet, jusqu'à quel point?

Un code bien construit en utilisant simplement des fonctions est tout aussi facile à maintenir tant que la règle primordiale est respecté :

Jamais de redondance dans le code...

Hors ligne

#7 Le 26/01/2007, à 15:31

Nicolas2b

Re : [PHP] Objet, jusqu'à quel point?

Salut,

Cool, ta deja utilisé ActiveRecord sans le savoir big_smile.

Je vai tenter d'explique ma notion d'affichage.
Tout d'abord un exemple de code ( c'est vraiment théorique là ) :

$id = $_GET['id']; //on imagine que tu recuper un id avec l'URL

$residence = new Residence( $id );

$liste_contact = $residence->getTousLesHabitants(); //methode qui recupere les habitants de la residence

Mainenant, tu veus faire un tableau ( par exemple )
           - methode 1 : dans le code/directement

echo '<table>';
foreach( $liste_contact as $contact )
{
    echo '
    <tr>
        <td>Contact</td>
         <td>' . $contact . '</td> // on imagine que l'on peut afficher un contact comme cela
     </tr>';                                 // en fait c'est pas vrai, utilise des methode qui vont bien ;)
}
echo '</table>';

- methode 2 : avec un classe
Elle pourrait etre codé comme cela :

class Tableau
{
        // Attributs
        private $style;
        ..............

        // Constructeur
        public function __construct(){}

        // Methodes
        public function ajouterLigne( $contenu ) { ............ } //Ici c'est un <tr> de plus 

        public function ajouterCase( $contenu ) { ............ } //Ici c'est un <td> de plus 
}

Le code deviendrai cela :

$tablo = new Tableau();

foreach( $liste_contact as $contact )
{
     $tablo->ajouterLigne();
     $tablo->ajouterCase( 'Contact' );
     $tablo->ajouterCase ( $contact );      // on imagine que l'on peut afficher un contact comme cela 
                                                                 //en fait c'est pas vrai, utilise des methode qui vont bien ;)
}

$tablo->ecrire();

Cela est très ' a peu pres' surtout au niveau de la classe tableau mais c'est pour l'idée, tu peux faire de meme avec les listes déroulante ....

Si tu veux pas te casser la tête, renseigne toi sur PEAR, ce sont des lib en PHP, qui ont déja fait ce que je vien de te montrer, et aussi une classe de connection pour BDD .....

Nicolas.



@ Bzh : on ait d'accord sur un point : pas de redondance de code wink


Ubuntu Gutsy sur ASUS A6JA Q016H
2 Go de RAM
ATI X1600
Core Duo 1,8 GHz

Hors ligne

#8 Le 26/01/2007, à 15:53

glattering

Re : [PHP] Objet, jusqu'à quel point?

Bzh, oui j'ai dit que les raisons étaient plus ou moins discutables, bon, disons que le premier point (mon apprentissage personnel) est indiscutable lui tongue

Nicolas2b, merci beaucoup, c'est beaucoup plus clair! Et là, y'a pas photo, je trouve ça bien plus clair de passer par une classe (encore fallait savoir comment le faire wink)

Juste une petite remarque cependant, dans le code, à la fin tu a rajouté
$tablo->ecrire();
Du coup je ne comprends pas très exactement à quel endroit est généré le code html.
- les fonctions ajouterLigne et ajouterCase font un echo <td>...</td> directement ou bien stocke le résultat dans une chaine de caractère et le echo est fait dans $this->ecire()?
Quel est le "mieux" (si c'est possible de définir le mieux)


Membre de l'APRIL - « promouvoir et défendre le logiciel libre » -

Hors ligne

#9 Le 26/01/2007, à 16:05

Nicolas2b

Re : [PHP] Objet, jusqu'à quel point?

Suivant ma "définition" de la classe tableau, les methodes ajouterai le contenu dans des attributs tel que des tableaux multi-dimensionnels ( array[][] ) ou des listes qui contiendrai le contenu ( rien que ça ).
Ensuite l'appel d'une methode 'ecrire()' permetterait de parcourir ces tableaux/listes et puis de generer le code html, et de l'écrire

=> tien, tu me donnes une idée pour cette classe : une methode pour ecrire ( et que ça ) et une methode pour générer et retourner le code html SANS l'ecrire ( par exemple si tu veux le stocker ou l'afficher tel quel )
Enfin, c'est une idée en passant roll

Je suis content que ça ait put t'aider big_smile

Nicolas.


Ubuntu Gutsy sur ASUS A6JA Q016H
2 Go de RAM
ATI X1600
Core Duo 1,8 GHz

Hors ligne

#10 Le 26/01/2007, à 16:37

glattering

Re : [PHP] Objet, jusqu'à quel point?

Intuitivement (et peut être anti-productivement) je pensais faire en effet 2 fonctions, une pour générer l'html, et une pour l'afficher (je sais pas pourquoi en fait).

Encore merci je pense qu'avec tout ça, j'ai de quoi me faire réfléchir pour un petit moment! ...avant la prochaine interrogation bien sûr.. hum.

/glattering, youpi.


Membre de l'APRIL - « promouvoir et défendre le logiciel libre » -

Hors ligne

#11 Le 26/01/2007, à 23:05

hugobosscool26

Re : [PHP] Objet, jusqu'à quel point?

Aprés avoir codé un agenda en php 5 ben je peux vous dire que c'est pas très très utile à part pour regrouper des méthodes ou à moins que vous commenciez à faire des gros sites smile Du moment où vous faites des requetes directes à la BDD sans créér d'objet les classes c'est pas top.

Un truc sympa que j'ai fais par contre c'est de l'héritage entre un simple visiteur, un membre et un admin, l'admin pouvant donc faire ce que fait le membre et le visiteur etc et ca c'est plutot sympa par contre smile

Et aussi garder les infos de l'user connecté dans une instance de la classe membre ou admin, la serializer et comme ca vous avez vos infos partout sur votre membre connecté (récupération pseudo, statut,mail...).

voilou mon avis

Hors ligne

#12 Le 27/01/2007, à 01:19

tenshu

Re : [PHP] Objet, jusqu'à quel point?

dans un site assez touffu dont les fonctionnalités peuvent être séparées en modules
Je dirais oui sans hésiter

Hors ligne

#13 Le 27/01/2007, à 13:22

Zapan

Re : [PHP] Objet, jusqu'à quel point?

Il me semble que php n'est pas interprété, mais compilé à la volé ( je sais plus ou j'avais lu ça ...)

Hors ligne

#14 Le 27/01/2007, à 13:32

kaworu

Re : [PHP] Objet, jusqu'à quel point?

Zapan a écrit :

Il me semble que php n'est pas interprété, mais compilé à la volé ( je sais plus ou j'avais lu ça ...)

oui, ça te permet de pouvoir appeler une fonction avant sa déclaration.
<troll>
Ruby On Rails pawa
</troll>


"There are in order of increasing severity: lies, damn lies, statistics, and computer benchmarks."

Hors ligne

#15 Le 27/01/2007, à 15:07

Bzh

Re : [PHP] Objet, jusqu'à quel point?

<troll>
Ruby On Rails pawa
</troll>

Alors pourquoi le site officiel de Ruby On Rails tourne sous php5 ???:D

Hors ligne

#16 Le 27/01/2007, à 16:02

glattering

Re : [PHP] Objet, jusqu'à quel point?

merci hugobosscool26 pour ton avis. Je viens de terminer la création des classes et méthodes concernant toutes les données que j'aurai besoin de stockerdans ma BDD, et j'avoue que je trouve le regroupement des méthodes super pratique et facile à visualiser, bref, je commence à apprécier l'objet smile

Tu parles de la sérialisation, j'ai plusieurs question à ce sujet.
- C'est le seul moyen de passer un objet?
- Peut-on passer plusieurs objets?

Quand on dit qu'un objet n'existe que pendant la durée du script, ça veut dire quoi exactement:
- si après stockage dans un objet du remplissage d'un formulaire, le bouton envoyer renvoie sur le même script, est ce que l'objet est perdu? (idem pour les variables normales)

Enfin, j'ai un dernière question concernant la connexion à la base de données (dans mon cas Mysql).
J'ai une fonction ajoutContactMysql, qui comme son nom l'indique ajoute un contact dans ma base en créant la requete qui va bien, et en effectuant cette requete.
Ma question est: vaut il mieux inclure dans cette fonction ajoutContactMysql la connexion à Mysql ou bien vaut il mieux y faire appel avant (en dehors)?

ce qui peut se résumer à: l'usage, c'est une seule connexion par script? ou bien une avant chaque opération?

Merci!
/glattering, qui avance lentement, mais sûrement!


Membre de l'APRIL - « promouvoir et défendre le logiciel libre » -

Hors ligne

#17 Le 29/01/2007, à 19:51

stopher

Re : [PHP] Objet, jusqu'à quel point?

le but de l'objet est assez simple ,
en tres tres gros , cela permet de structurer son code , éviter le répétition de code , ce qui facilite grandement les mises à jour optimisation et modification de celles ci .. tout ce concentre à un seul endroit .

pour moi , un objet (qui est en fait une classe non instancié ) doit etre la plus générique possible , affin qu'elle puisse etre réutilisé facilement , sans avoir à modifier de code ..

Créer une classe uniquement pour effectuer des requêtes , n'apporte (en tt cas c'est mon avis ) pas grand chose de tres utile , ni tres fonctionnel , (surtout pour le traitement des resultats qui peuvent etre complètement différents ) .

Je pense qu'une classe est tout d'abord un outil , exemple , une classe qui est en fait un moteur de recherche (toujours générique) , pour l'ajouter dans ses pages , on l'inclue , on l'instancie , avec "new" , on recupere donc un pointeur , ce pointeur va nous permettre d'accéder aux méthodes et variables de l'objet ...

dons , on configure les paramètres de l'objet , soit dans le constructeur quand c'est possible , ou par des méthodes souvent appelé "set_le_nom($val);" nommé aussi des "assesseurs"

une fois l'objet configuré à souhait , (exemple , on definie dans quelle table on travail , quels sont les champs de recherche , le nombre de resultat par page ... ect ect en fonction de ce que peut proposer l'objet comme option ) on lance la methode qui retourne par exemple le formulaire de recherche .. (qui est ni plus ni moins que du code generé automatiquement en fonction des attributs entrés ) .

pour effectuer une recherche sur des mots clef , on appel la méthode qui va effectuer la recherche dans la base de données en passant en paramètre les mots clef , puis enfin , on appel la méthode qui s'occupe de l'affichage des résultats .

cet exemple d'utilisation , pour dire , qu'une fois développé , on intègre un moteur de recherche complet dans ses pages en seulement 3 lignes + les paramètres , et étant generique , un simple copier coller dans le répertoire d'un autre site par exemple , et voilà vous avez votre moteur de recherche prêt à l'emploi pour ce nouveau site , avec des bases de données différentes ..

apres pour ce qui est de sérialiser un objet .. et bien , j'avoue que je l'utilise tres rarement disons que j'en ai pas encore vraiment eu l'utilité .

apres , un objet est utilisable partout , à partir du moment ou l'on a le pointeur , qui peut être passé en paramètre dans une méthode .

Ensuite , on ne peut pas passer un objet complet d'une page à l'autre comme ca .. car dés qu'une page est rechargé par le navigateur , c'est comme si tu faisais un raz de toutes tes variables/tableaux ect ... sauf au niveau des sessions et cookies , c'est à ce moment là que la serialisation d'un objet peut s'avérer utile afin de le rendre en quelque sorte persistant ... en l'enregistrant soit dans une session .. ou dans un cookies , ou même dans un fichier .

En bref , il ne faut pas faire des classes partout pour y mettre pleins de méthodes qui vont eu finale en remplacer d'autres ..

Il faut plutôt voir le coté utile et générique .
sinon , autant utiliser des fonctions ce qui est plus simple et moins lourd à utiliser ..

Pour donner des idées de classes , regardez par exemple , les classe "phpchart" qui permet de generer des graphiques, les classes qui permettent de generer des page en pdf , de sortir des tableaux dynamiques avec plein d'options qui permettent par exemple de faire un coloration des ligne 1/2 , de donner une couleur au texte en fonction d'une valeur récupérer dans la base , de créer des liens , affichage page par page , tronquer la longueur si celle ci est trop longue , afficher ou masquer des colonne à souhait pour chaque utilisateur , ect ect .. il y en a plein (celle là c'est moi qui l'ai cree il y a de ça qq temps pour le travail et je l'utilise toujours exemple ici : http://www.ubuntu.dsl-fr.eu/.

Maintenant , je pense que chacun code avec ses idées ses habitudes , de la façon dont il le souhaite .

C'est mon point de vue "en gros" sur la programmation dit objet en php .

Si vous n'êtes pas entièrement d'accord avec moi c'est normal , comme je l'ai dit , chacun a sa propre façon de coder .. mais on est là pour apprendre pas pour s'insulter ou dire , "c'est n'importe quoi , c'est moi qui ai raison" alors n'hésitez pas à me contredire c'est toujours intéressant de connaître le point de vue des autres . tongue

Voilà pour mon point de vue smile

Hors ligne

#18 Le 06/02/2007, à 14:01

glattering

Re : [PHP] Objet, jusqu'à quel point?

Merci stopher pour ce petit topo!!
Là je me suis lancé dans l'affichage et notamment dans une classe de création de formulaires (je sais qu'il en existe déjà, que j'ai parcourues d'ailleurs, mais pour apprendre rien ne vaut de le faire par soi même wink)
Pour l'instant j'ai fait quelque chose de très basique, avec des methodes ajouter select, input etc qui ne font que rajouter du code html dans une variables (avec les controles qui vont bien: pas d'ajout d'option sans select etc).
Mais par exemple mais j'aimerais créer plutot une liste chainée d'elements (balises, champs input, select, etc) comportant chacun une methode d'affichage qui retournerait lel code html.
Ce qui me permetterait par ex de créer une fois pour toute les champs de sélection des mois et des jours et de juste faire un include.

Encore merci.
/glattering


Membre de l'APRIL - « promouvoir et défendre le logiciel libre » -

Hors ligne