IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

PHP et algorithmie


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut PHP et algorithmie
    Bonjour,

    Je developpe un site Web en php5. J'ai cree tout un tas de classe, et je me soucis beaucoup de l'optimisation du code, plus au niveau de la lecture et de la logique pour le moment que au niveau du temps d'execution. En fait, c'est un bout de site CMSise qui va me resservir, donc plus je developpe des outils performants et plus j'irai vite pour la suite ...

    Voila pour les presentations, passons a ma question.

    Alors suivez moi :

    Je veux afficher des catégories contenues dans une table SQL. Pour ce faire :
    - J'initialise ma classe LesCategories avec des requete SQL d'une classe requeteBDD (les anciens etudiant IG reconnaitrons :-))
    - qui elle meme ajoute des elements Categorie d'une classe categorie
    - et les stocke dans une liste collection d'une classe collection
    - qui elle meme est definie par le type listeDoublementChainee qui provient d'une classe liste

    Ma tache la, c'est creer un select/option html avec la liste des categories.

    Comme un cochon, je creerai ca dans ma classe LesCategories :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function retournerCategories() {
      print "<select>";
      for($i=0;$i<$this->lesCategories->cardinal();$i++) {
        print "<option value='{$this->lesCategories->extraire("idCategorie")}'>$this->lesCategories->extraire("nomCategorie")</option>";
     }
      print "</select>";
    }
    Mais "il parait" qu'il faut eviter de mettre du code HTML dans les classes, et c'est vrai que quand je regarde ce qui se fait sur le net, on fini toujours par des "return", et quasi jamais avec du html dedans.

    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function retournerCategories() {
      return $this->lesCategories
    }
    Cette solution me parait un peu sterile ...

    Une meilleure solution chers specialistes ?

    D'avance merci.



    Matt

  2. #2
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Mais "il parait" qu'il faut eviter de mettre du code HTML dans les classes,
    Oui et non. Disons qu'il ne faut pas en mettre dans n'importe quelle classe.
    Pour un cas comme ca, je retournerai dansl a fonction retournerCategories, un tableau "identifiant" "valeur".

    Et a coté, je ferai une classe d'affichage, avec une méthode static genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    generateurHtml::creerSelect($tab)
    Et c'est cette méthode là qui va lister les éléments de ton tableau et creer ton code html.

    Comme ca, ton code html généré est a un seul endroit et tu pourra le réutiliser a chaque fois que tu veux faire un select, pour peu que tes classes qui vont chercher les données les sortent dans un format standard.

  3. #3
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    La classe affichageHMTL, je n'y avait pas pense, pourquoi pas, je vais m'y pencher mais ca m'a l'air bien propre :-).

    Mais j'ai une question stupide, dans la logique, puisque j'ai cree un systemem de listes chainees,ne devrais-je pas me restreinte a n'utiliser que ce systeme plutot qu'un tableau ? (non pas pour le plaisir de me restreindre, mais pour avoir un algo coherent)

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 230
    Points
    20 230
    Par défaut
    Perso je vois pas bien l'intérêt des listes chainée dans ton affaire , c'est certes plus rapide qu'un tableaux dans un langage ou ces liste "existe" , mais en php ou les pointeurs ne sont pas utilisables je vois pas bien l'utilité face a des tableaux qu'on peut manipuler comme bon nous semble.

  5. #5
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    J'ai cree ce systeme a cause de la gestion des index de tableau, c'etait ingerable de supprimer des entrees et de reafficher les contenus ... meme apres des tris ..., mais dans le cas present, le probleme ne se poserai pas.

    Comme tu dis, les pointeurs n'existent pas, et il a fallu contourner ce maque par des astuces, mais le resultat est relativement rapide et tres fonctionnel puisque sur mesure.

    Ce qui ne repond pas vraiment a ma derniere question, a savoir, dois-je utiliser les 2 types, listes ET tableaux ?

  6. #6
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    J'ai une autre question alors que je m'attelle a realiser ta solution :

    Je cree dans ma classe une fonction du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    	function retournerCategories() {
     
    		$cardinal = $this->lesCategories->cardinal();
    		$this->lesCategories->deplacerPointeur();
    		$resultat = array();
     
    		for($i=0;$i<$cardinal;$i++) {
     
    			$resultat[$i][] = $this->lesCategories->extraire("idCategorie");	
    			$resultat[$i][] = $this->lesCategories->extraire("nomCategorie");
     
    		$this->lesCategories->deplacerPointeur('+');	
     
    		}
     
    		return $resultat;
    Mais ca fait un peu redondance car j'ai deja une liste d'objet categories stockee dans $this->lesCategories.

    Du coup en faisant ca, je transforme ni plus ni moins ma liste en tableau. C'est mieux ?


    [J'ai edite mon post parce que j'avais ecris une enormite dans mon code ^^]

  7. #7
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Mais j'ai une question stupide, dans la logique, puisque j'ai cree un systemem de listes chainees,ne devrais-je pas me restreinte a n'utiliser que ce systeme plutot qu'un tableau ? (non pas pour le plaisir de me restreindre, mais pour avoir un algo coherent)
    Mais ca fait un peu redondance car j'ai deja une liste d'objet categories stockee dans $this->lesCategories.
    Si en C, les listes chainées sont indispensables, l'interet en php est effectivement discutable dans la mesure ou les tableaux php sont franchements souples, pratiques à utiliser, et qu'il existe un tas de fonctions dédiées qui s'appliquent à ces tableaux.
    Maintenant, si tu fais le choix d'utiliser des listes chainees codées par tes soins, pourquoi pas, mais il faudra assumer ce choix jusqu'au bout.
    J'ai proposé d'utiliser un tableau pour la fonction d'affichage d'un select, parce que c'est ce qu'il y a de plus générique. Tu peux évidement utiliser directement la structure que tu possède déjà. Il faut juste avoir conscience que si tu veux réutiliser ta classe d'affichage par la suite, il faudra que tu sois en mesure de fournir ton format "perso". En d'autres termes, chaque classe qui a des données qui potentiellement devront se faire transformer en select html doit pouvoir envoyer celles-ci de la même façon a ta classe qui gère la construction du code html.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $resultat[$i][] = $this->lesCategories->extraire("idCategorie");
    $resultat[$i][] = $this->lesCategories->extraire("nomCategorie");
    Petit point de détail, perso, pour ce genre de chose là, j'aime bien mettre un nom explicite a mon indice de tableau du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $resultat[$i]['idCategorie'] = $this->lesCategories->extraire("idCategorie");
    $resultat[$i]['nomCategorie'] = $this->lesCategories->extraire("nomCategorie");
    En terme de perf, il n'y a quasi aucune différence et je trouve ca plus agréable à lire. 'fin, ca n'engage que moi et ce que tu as fait est tout à fait valable.

  8. #8
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Maintenant, si tu fais le choix d'utiliser des listes chainees codées par tes soins, pourquoi pas, mais il faudra assumer ce choix jusqu'au bout.
    Ok.

    Une derniere question par rapport a ta premiere reponse, j'ai commence a coder une classe generateurHTML, a l'utilisation, ca me fait donc des choses comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    $LesCategories = new LesCategories;
    $GenerateurHTML = new GenerateurHTML;
    $optionListeCategorie = $GenerateurHTML->creerSelect('categorie',$LesCategories->retournerCategories());
     
    $html = <<<END
     
    <html>
    // Je fini avec des [] parce que je vais quand meme pas taper toute une page html ^^
     
      [entete]
      [declaration formulaire ...]
      $optionListeCategorie
      [on ferme toutes la balises ...]
     
    END;
     
    print $html;
    La question est donc :
    J'ai appelle du code html dans ma page "d'appel" (genre inscription.php), et j'y ai apporte un bout de code venu d'une nouvelle merveilleuse classe qui genere du HTML. Mais ne devrais-je pas mieux generer TOUT le coe HTML via cette classe ?

    et en consequence faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    $LesCategories = new LesCategories;
    $GenerateurHTML = new GenerateurHTML;
    $optionListeCategorie = $GenerateurHTML->creerSelect('categorie',$LesCategories->retournerCategories());
     
    $entete = $GenerateurHTML->genererEnTete();
    $formulaire = $GenerateurHTML->genererformulaire($donnees);
    $pieddepage = $GenerateurHTML->genererPied($donnees);
     
    print $entete;
    print $formulaire;
    print $pieddepage;

  9. #9
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par keaton2000 Voir le message
    J'ai appelle du code html dans ma page "d'appel" (genre inscription.php), et j'y ai apporte un bout de code venu d'une nouvelle merveilleuse classe qui genere du HTML. Mais ne devrais-je pas mieux generer TOUT le coe HTML via cette classe ?
    J'aurais une meilleure proposition, c'est d'adopter un système (ou moteur) de templates, du type Smarty, PHPLib, etc., ce qui te permettrait d'avoir une séparation claire et nette entre ton code métier et l'IHM en HTML.

    En ce qui concerne le choix cornélien tableau ou classe, il faut savoir que PHP permet à une classe d'adopter le comportement d'un tableau lors d'une itération, il lui suffit d'implémenter l'interface Iterator avec toutes ses méthodes.

    Sur un plan général, l'effort de rationalisation est louable, mais tu peux gagner du temps (et des nerfs) en évaluant les frameworks MVC actuellement disponibles : ils présentent une architecture conforme à ce vers quoi tu tends.

  10. #10
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Merci pour tous ces conseils !

    Je vais regarder de pres l'histoire des template effectivement, ca me parait etre interessant, tout autant que la classe genereHTML, je vais regarder e pres ce qui se fait, et j'essaierai de developper un truc satisfaisant pour mon systeme de sites web.

    Pour la classe Iterator, je ne connaissait pas a vrai dire, en fait il s'agit juste d'une collection d'elements avec un tableau derriere ? C'est ce que j'ai fait mais avec des listes j'ai l'impression. L'Iterator dont tu parles est une propriete ? une library ? Un procede ?

    Pour les framework, je regarderait egalement, mais j'aimerai bien finir de devolopper mon systeme, et revenir dessus pour le perfectionner par la suite. Je ne dis pas qu'il faut reinventer la roue a chaque fois qu'on veut faire un truc, mais j'ai besoin de faire les choses pour pouvoir en comprendre les enjeux ... Apres c'est sur que je ne vais pas redevelopper scriptaculous Donc a voir.

    Au passage, j'ecris toutes mes variables, classes et methodes en francais la dedans, vous pensez quoi du dev en francais ? (A vrai dire, je trouve ca plutot bordelique etant donne que les languages sont en anglais, ca fait un peu charabia, la lecture est moins intuitive).

  11. #11
    Membre averti Avatar de Kennel sébastien
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 226
    Points : 329
    Points
    329
    Par défaut
    C'est exact tu devrais utilisé un système de templete et appliquer le motif MVC.

    Iterator est un des motifs du GoF...

    Pour le développement en français, ça a le gros avantage de faire facilement la différence entre ce que tu développes et ce qui est du langage que tu utilises.

  12. #12
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par keaton2000 Voir le message
    Pour la classe Iterator, je ne connaissait pas a vrai dire, en fait il s'agit juste d'une collection d'elements avec un tableau derriere ? C'est ce que j'ai fait mais avec des listes j'ai l'impression. L'Iterator dont tu parles est une propriete ? une library ? Un procede ?
    Iterator est une interface et fait partie, avec d'autres interfaces et classes, de la SPL. En implémentant cette interface dans ta classe, elle se comportera comme un tableau quand tu l'utiliseras (ou plutôt une de ses instances) dans foreach(). Pour l'utilisation des interfaces, je te conseille le tutoriel d'Alain Sahli.

  13. #13
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Moi qui croyait que la doc php se limitait a une liste de fonctions ;-). J'ai de la lecteur su cote du lien SPL ... et apres recherche, du cote MVC aussi.

    L'iterator, ce que je disais, c'est que c'est globalement ce que j'ai fait dans mon programme, et que je n'ai bien sur pas invente, c'est tout droit sorti des nombreuses etudes de cas en algo et C qu'on apprend a l'ecole. Genre une liste, une classe collection, et des objets qu'on collectionne. Je ne me trompe pas ?

    Pour le template, je pense que je vais arreter de ma prendre la tete sur des trucs bete dans la clase generateur HTML qui risque de finir morte nee et etudier en profondeur les logiques de template.

    Juste, allez y molo sur les abreviations, il y en a 3 par post, merci wikipedia :-)

  14. #14
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Oui, les templates sont aussi une solution. J'ai déjà bossé un peu avec smarty et c'est franchement bien fichu pour des perfs correctes.
    On peut notamment faire des boucles, ce qui fait que du coup, c'est smarty qui pourrait itérer pour réaliser ton select.

  15. #15
    Membre averti Avatar de Kennel sébastien
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 226
    Points : 329
    Points
    329
    Par défaut
    Citation Envoyé par keaton2000 Voir le message
    L'iterator, ce que je disais, c'est que c'est globalement ce que j'ai fait dans mon programme, et que je n'ai bien sur pas invente, c'est tout droit sorti des nombreuses etudes de cas en algo et C qu'on apprend a l'ecole. Genre une liste, une classe collection, et des objets qu'on collectionne. Je ne me trompe pas ?
    Iterator est un motif de conception (design pattern). Si tu tiens à vraiment le comprendre, cherche un tuto dessus, plutôt que d'appliquer quelque chose que tu ne comprends pas vraiment...

  16. #16
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Je comprend ce que j'applique, mais je ne comprend pas si ca correspond a un pattern Iterator ^^

    Je vais effectivement me documenter, a vrai dire en 5 ou 6 messages, vous m'avez ouvert des horizons plutot interessants, donc je vous tiendrai au courant un peu plus tard, une semaine, un mois, un an ^^ qui sait ...

    Le soucis de base est bien entendu resolu, je le note.

  17. #17
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Coucou,

    Je suis toujours sur le meme projet, donc je vais continuer ce post ^^.

    Une petite question concernant la synthaxe des classes :

    En general (et dans un soucis d'uniformite par rapport aux normes du language), les proprietes doivent etre privees et les methodes crees pour les modifier publiques

    ou

    les proprietes doivent etre public si necessaire ?

    EXEMPLE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    class Toto {
     
      private maVar1;
      private maVar2;
     
      [...]
     
      public function modifierElement($elementModifie,$valeurAttribuee) {
     
        $this->$elementModifie = $valeurAttribuee;
     
      }
     
    }
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Toto {
     
      var maVar1;
      var maVar2;
     
    }

  18. #18
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    En plus de la precedente, j'ai une autre question : :-)

    Les proprietes des classes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var toto
    var tata
    var tutu
    doivent-ils necessairement etre le reflet des donnees stockees dans la bdd ?

    Je m'explique, j'ai une table : "Truc" avec comme champ toto, tata et tutu. Mais Truc est en fait un conteneur de Machins. Je ne stocke pas machin dans la bdd parce que machin contient dans sa table un champ idTruc.

    Pourtant, dans ma classe Truc, il me faut une propriete ListeMachin pour lister les trucs et les machins ensemble.

    Vous me suivez ?

  19. #19
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Bon je suis parti du principe que non, c'est beaucoup trop contraignant si c'est la cas ;-)

    Je stocke donc des objets dans des objets, genre Boule, un enfant, a un stock de billes, qui est une collection de billes. Cette collection est stockee directement dans les parametres enfant dont Boule est une instance.

    Et ca ira bien comme ca ! ^^

    Si vous avez des objections, je reste ouvert ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [EDI] Quel est l'éditeur que vous recommandez pour PHP ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 400
    Dernier message: 10/04/2018, 20h08
  2. Quel est le meilleur script PHP de portail (CMS) ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 187
    Dernier message: 18/10/2012, 07h45
  3. L'avenir est-il au PHP ?
    Par Manolo dans le forum Langage
    Réponses: 468
    Dernier message: 11/02/2008, 18h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo