Archive pour la catégorie ‘PHP’

Quelques trucs sur PHP #1

Mercredi 22 août 2007

Quelques petits trucs que je n’ai appris que récemment. Peut-être étais-je le seul à les ignorer… ou peut-être pas, donc dans le doute…

Sortir de plusieurs boucles à la fois

Classiquement l’instruction break; s’utilise telle quelle pour sortir de la boucle ou du switch courant. Cependant en PHP (et sans doutes dans d’autres langages également), on peut lui adjoindre un paramètre entier permettant de sortir de plusieurs boucles à la fois. Ceci est à utiliser avec parcimonie car ce n’est pas forcément des plus lisible mais ça peut aider à accélérer une recherche dans un tableau multi-entrées par exemple :

// Supposons que $array est un tableau à
// double-entrée contenant des entiers
// et que l'on en cherche un supérieur à 10.
$result = null;
foreach ($array as $subArray)
{
   foreach ($subArrayas $item)
   {
      if ($item > 10)
      {
         $result = $item;
         break 2;
      }
   }
}

Paramètre de la fonction die

C’est plus une instruction qu’une fonction mais bon, passons. Elle peut prendre en argument un entier ou une chaine de caractère mais cet argument n’est affiché à l’écran que s’il s’agit d’une chaine. Ça n’a l’air de rien mais c’est bon à savoir…

DOM ou SimpleXML ?

SimpleXML c’est bien gentil et comme son nom l’indique, c’est «simple» (du moins dans son interface qui compte très peu de méthodes), mais à l’usage c’est quand même des plus limités. Et c’est plutôt chiant à utiliser parce qu’il faut caster pas ma de choses pour obtenir des chaines de caractère au lieux de nœuds XML (sans compter le bug dont je parlais il y a quelques temps). D’autant qu’il existe une alternative…

En effet, j’en étais resté à PHP4 où l’API DOM se cantonnait l’extension DOM XML non-incluse par défaut, ce qui n’était pas bien pratique… Mais en PHP5, elle a été remplacée par une nouvelle implémentation incluse en natif dans PHP sous le nom de DOM. Bref, en ce qui me concerne, SimpleXML va direct à la poubelle et je n’utilise plus que DOM, avec l’avantage supplémentaire d’être similaires aux bibliothèques DOM présentes dans d’autres langages tels que Javascript, puisque DOM est un standard, ce qui raccourcit d’autant l’apprentissage.

PHPTAL, moteur de templates XML

Samedi 16 juin 2007

PHPTAL est un moteur de templates spécialisé dans la production de documents XML (et donc (X)HTML puisqu’il s’agit d’un langage XML).

Les templates qu’il utilise sont définis en XML valide, PHPTAL ajoutant ses propres attributs qui sont ensuite traité par le moteur. Le code des templates est donc purement de l’XML et non un code bâtard XML/PHP comme c’est le cas avec certains autres moteurs.

Avantages :

  • il n’accepte que du code XML valide, ce qui permet de détecter rapidement toute erreur d’imbrication.
  • le code des templates est de l’XML ce qui donne la possibilité de l’exploiter ou de le générer via les bibliothèque de gestion de fichiers XML habituelles.
  • il est installable sous forme de package pear ce qui rend son déploiement et sa mise à jour très simples.
  • comme il est entièrement XML il est en général plus accessible pour le graphiste qui pourra être chargé de construire les templates.

Inconvénients :

  • il ne permet a priori de générer que du code XML (ou de tout langage XML) ce qui peut être limitatif.
  • peut s’avérer limité par rapport à d’autres moteurs pour des traitements complexes.
  • le code des templates n’est pas forcément toujours des plus compacts.

Cela fait quelques mois que je l’utilise au boulot et j’en suis globalement satisfait, du moins dans les cas que j’ai eu à traiter avec… Cela dit je n’ai pas beaucoup expérimenté d’autres moteurs (à part celui de phpBB 2 qui est assez limité).

SimpleXML et sections CDATA

Dimanche 3 juin 2007

PHP5 inclut de base la bibliothèque SimpleXML qui permet, comme son nom l’indique de gérer de manière très simple du code XML.

Un point est par contre problématique, la gestion des sections CDATA. En effet, supposons que l’on parte du code XML suivant :

<?xml version="1.0"?>
<root>
   <parent>
      <child>123</child>
      <child><![CDATA[456]]></child>
      <child attr="a"><![CDATA[789]]></child>
   </parent>
</root>

losque l’on récupère les enfants d’un nœud via :

$parentnode->child;

On a la mauvaise surprise de ne pas obtenir tous les nœuds… En effet :

  • le premier passe sans problème, car il ne contient pas de section CDATA.
  • le second contient un CDATA et se perd dans la nature…
  • le troisième contient un CDATA mais a également un attribut, il est alors correctement renvoyé (ne me demandez pas pourquoi).

Par contre, dans le cas où tous les nœuds sont basés sur le modèle du second (CDATA sans attribut), le premier est bien trouvé et retourné (au lieu d’un tableau).

Une fois le problème identifié j’ai fait quelques recherches et j’ai pu trouver cette solution consistant à éliminer les CDATA avant le traitement du code XML. Je ne la trouve pas très satisfaisante mais je n’ai pour l’instant rien trouvé d’autre…