Journal Une question de PHP

Posté par  (site web personnel) .
Étiquettes : aucune
0
26
nov.
2003
J'ai programmé en PHP voici qq temps déjà des fonctions me permettant de poster des news en PHP sous différentes formes. Ces news sont stockées dans des fichiers textes (format CSV), pour des raisons de rapidité et de facilité de maintien (ça se discute, mais bon...). Je voudrais bien les diffuser avec d'autres fonctions -pour faire une sorte de package permettant de mettre en place un weblog léger avec forum et sans db et bon du point de vue du référencement dans les moteurs de recherche)- mais pour cela j'essaie d'assainir le code.

Ma question est la suivante : que faut-il mieux du point de vue rapidité d'éxécution entre faire une fonction par type d'affichage et faire une fonction générale avec des 'switch ... case' ? Je m'explique.

Mes news peuvent s'afficher sous forme de liste, de sommaire, de résumé ou complètes. Pour le moment, j'ai donc show_news_short, show_news_summary, show_news_abstract et show_news_full. D'où copier-coller de code -> pas beau ! Je pense donc faire une fonction unique show_new qui comprenne des switch ... case prenant en compte les différentes forme d'affichage. Cependant, un de ces switch ... case se retrouverait dans la boucle 'while' lisant le fichier de news ligne par ligne. D'où ralentissement par rapport à la première solution (à moins que PHP ne 'compile' le code présent dans la boucle ?).

Qu'en pensez-vous ?


Autre question : procédures ou méthodes dans des objets ?
  • # Re: Une question de PHP

    Posté par  . Évalué à 2.

    Moi ce que je ferais, c'est un fichier "template" par type de news. Pas des templates au sens classique du terme hein, des templates avec des vrais bouts de php tout frais dedans. Et ensuite tu fais une fonction genre show_news($mode) qui appelle le bon template en fonction de $mode.
    • [^] # Re: Une question de PHP

      Posté par  (site web personnel) . Évalué à 1.

      Tu peux me donner un exemple simple ?
    • [^] # Re: Une question de PHP

      Posté par  (site web personnel) . Évalué à 1.

      Un collègue m'avait parlé d'une autre possibilité (mais il n'était plus sûr) : celle de jouer avec des pointeurs sur fonctions. Cela existe-til en PHP (je n'ai rien trouvé sur PHP.net ou ASP-PHP.Net) ?
      • [^] # Re: Une question de PHP

        Posté par  . Évalué à 2.

        jamais entendu parler de "pointeurs sur fonctions" en php :/
        explique un peu le principe ? peut etre que ça existe sous un autre nom ou qu'on peut l'émuler
        • [^] # Re: Une question de PHP

          Posté par  (site web personnel) . Évalué à 1.

          Ca existe en C. Je n'ai pas utilisé bcp, mais c'est assez marrant. Tu peux définir des types qui contiennent des pointeurs sur fonctions, ce qui fait que tes types deviennent des sortes de pseudo-classes.

          Donc l'idée, c'est d'initialiser ton pointeur sur fonction avant la boucle, en fonction de ce que tu veux comme affichage. Le code dans le corps de la boucle resterait le même puisque tu n'utilises que le nom du pointeur sur fonction, qui ne change pas.

          Voir par exemple http://www.ann.jussieu.fr/courscpp/Sections/Sect05-H0.html(...)
        • [^] # Re: Une question de PHP

          Posté par  . Évalué à 2.

          lt;?php
          function truc ($machin) { return $machin; }

          $ma_fonction = 'truc';

          echo $ma_fonction('hello world');
          ?>


          Dam
        • [^] # Re: Une question de PHP

          Posté par  (site web personnel) . Évalué à 2.

          Je pense qu'il parle d'utiliser une variable php pour appeler une fonction. En gros t'as une fonction qui s'appelle machin.
          Tu stocke "machin" dans la var foo, puis tu fais $foo() .... qui en fait appelle la fonction machin. Cherche variable de variable dans la doc php

          Et ca peut aller plus loin encore... enfin l'idee c'est d'eviter le switch. Mais c'est du bricolage infame qui donne des maux de tetes avec une doc illisible et une maintenance sans fin.

          Le mieux c'est d'utiliser les concepts objets, notemment l'heritage.... Avec une classe abstraite qui contient toutes les fonctions utilisees par tous et les fonctions virtuelle pure et des classes concretes filles avec des fonctions specifique a ton affichage.

          Si tu connais pas, c'est l'occasion de t'y mettre :

          http://uml.free.fr(...)
          http://sebsauvage.net/comprendre/objet/objet_heritage.html(...)
          • [^] # Re: Une question de PHP

            Posté par  . Évalué à 1.

            j'avais justement pensé à faire de l'objet pour son problème, mais je me suis dit que finalement la méthode "templates" était plus simple a mettre en place
          • [^] # Re: Une question de PHP

            Posté par  (site web personnel) . Évalué à 1.

            Je connais, mais n'avais pas pensé à prendre le problème par ce bout-là.

            En tout cas, merci à tous pour vos commentaires constructifs.
    • [^] # Re: Une question de PHP

      Posté par  (site web personnel) . Évalué à 3.

      Moi ce que je ferais, c'est un fichier "template" par type de news. Pas des templates au sens classique du terme hein, des templates avec des vrais bouts de php tout frais dedans.

      Et pourquoi pas ne pas utiliser de vrais templates, qui sont justement conçus pour séparer le traitement de la présentation ?

      P.ex en utilisant Smarty (http://smarty.php.net(...)) :

      $smarty = new Smarty;
      // $news peut être toute structure de données simple ou complexe, (objet, tableau, tableau de tableaux associatifs...)
      $smarty->assign('news', $news);
      // affichage.
      $smarty->display('news_' . $mode. '.tpl');

      Il y a bien sûr un prix à payer (en temps d'exécution) pour cette souplesse mais il est faible car les templates sont 'compilés' en vrai code php et la page html générée par un template peut être optionnellement cachée.

      Le gain de cette approche est la facilité de mise au point (une console permet de visualiser le contenu des variables passées au template) et de maintenance (p.ex pour la gestion d'un site multilingue).

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.