Articles taggés avec ‘PHP’

Quelques trucs sur PHP #3

Dimanche 9 mai 2010
Auto-complétion du code avec PDT

PDT est un IDE pour PHP basé sur Eclipse relativement performant. Notamment il permet l’auto-complétion de code, ce qu’on n’a que rarement avec des éditeurs plus légers.

Sous certaines conditions (notamment avec le plugin SVN), l’auto-complétion n’est pas activée par défaut. Il y a peut-être moyen de le régler dans le labyrinthe qui sert de système d’options à Eclipse mais sinon, un moyen simple reste d’ajouter la ligne suivante dans la section natures du fichier .project du projet :

<nature>org.eclipse.php.core.PHPNature</nature>

Flux RSS et format de date

Pour formater une date en vue de générer un flux RSS, il y a plusieurs méthodes :

  1. chercher le détail du format sur le net et l’appliquer… c’est possible mais risque d’erreur.
  2. utiliser le format ‘r’ qui renvoie le bon format.
  3. utiliser la constante DateTime::RFC822… sauf que là le flux ne sera pas forcément valide et qu’il y aura potentiellement des problèmes avec certains agrégateurs.

Préférez donc la seconde solution, celle-là en principe elle marche (et en bonus c’est la plus compacte, que demander de plus ?).

Méthodes privées en PHP 5.1.6

Le principe d’une méthode privée c’est d’être interne à la classe et aucunement visible ou surchargeable depuis une classe qui l’étend (contrairement à une méthode protégée). Cependant dans certaines versions de PHP, dont la 5.1.6 (je ne sais pas quand exactement il a été corrigé mais il n’est plus présent dans les dernières 5.2.x), permet de surcharger les méthodes privées d’une classe… Ça peut arriver involontairement et ne prête pas à conséquence, sauf quand par la suite vous tentez d’exécuter votre script sur une version corrigée de PHP et là c’est pas évident de comprendre pourquoi tout d’un coup on ne passe plus dans la surcharge !

L’angoisse de la page blanche #2

J’évoquais ici le fait qu’on risquait une page blanche sans autre forme de procès en déclarant deux fois une même méthode dans une même classe et en voici un autre : déclarer comme abstraite une méthode d’une interface.

C’est peut être une déformation due au fait qu’on me l’a présenté comme ça lors de mes premiers cours de programmation objet Java mais pour moi une interface c’est pousser à l’extrême le concept de la classe abstraite : toutes les méthodes sont abstraites (et on n’a pas de champs). En Java, il me semble bien me souvenir que dans le cas d’une interface, le mot-clé abstract sur une méthode est facultatif (vu que de toutes façons toutes les méthodes d’une interface le sont). Eh bien en PHP il n’est pas facultatif mais interdit. Sinon, page blanche (du moins sous certaines versions/configurations) et bon courage pour retrouver l’erreur \o/

  • Print this article!
  • Turn this article into a PDF!
  • E-mail this story to a friend!
  • Facebook
  • Twitter
  • del.icio.us
  • Digg
  • Google Bookmarks
  • BlogMemes Fr
  • Wikio FR
  • Netvibes

Petit bench sur la recherche dans un tableau PHP

Samedi 1 août 2009
Préambule…

Hier, j’avais à parcourir un tableau d’objets (pouvant avoir potentiellement des centaines voire exceptionnellement milliers d’entrée) pour rechercher si l’identifiant de l’un d’eux se trouvait dans un second tableau. J’avais commencé par utiliser pour ça la fonction in_array() à chaque itération pour voir si l’identifiant de l’objet était présent ou non dans le second tableau.

En voyant cela, un collègue m’a fait remarquer que ce serait peut-être plus performant de construire un tableau dont les clés sont les valeurs du second tableau (via array_flip()) pour pouvoir utiliser isset() au lieu de in_array() et voici les résultats obtenus :

Structure du bench

Le bench consiste à rechercher 100 000 fois la même valeur dans le tableau array('11345', '7437', '7329', '45494', '7894311', 'sdfsdg', 'qsqsdcirt', 'd787 sdfs df'), avec trois méthodes différentes :

  • in_array()
  • array_flip() suivi de isset()
  • array_flip() suivi de array_key_exists()

Le test est effectué avec deux valeurs différentes : d’abord avec la première valeur du tableau (cas théoriquement le plus favorable puisqu’on arrête la recherche une fois la valeur trouvée) puis avec une valeur qui n’est pas dans le tableau (cas théoriquement le plus défavorable puisqu’on est obligé de parcourir tout le tableau). Le résultat en conditions réelles sera donc compris dans cette fourchette.

Cas in_array()

Code exécuté :

for ($i = 0; $i < 100000; $i++)
{
   in_array($value, $values);
}

Cas favorable ($value = '11345') : ~0.33 secondes
Cas défavorable ($value = 'uottuyi') : ~0.52 secondes

Cas isset()

Code exécuté :

$keys = array_flip($values);
for ($i = 0; $i < 100000; $i++)
{
   isset($keys[$value]);
}

Cas favorable ($value = '11345') : ~0.12 secondes
Cas défavorable ($value = 'uottuyi') : ~0.09 secondes

Cas array_key_exists()

Code exécuté :

$keys = array_flip($values);
for ($i = 0; $i < 100000; $i++)
{
   array_key_exists($value, $keys);
}

Cas favorable ($value = '11345') : ~0.27secondes
Cas défavorable ($value = 'uottuyi') : ~0.24 secondes

Et pour de plus petites quantités ?

Les grands volumes c’est bien mais qu’est-ce que ça donne quand on a peu d’itérations ?

Un test à 5 itérations au lieu de 100 000 donne environ le même résultat pour les trois méthodes : avec ~6E-05 secondes pour les méthodes 1 et 3 et ~5E-05 pour la méthode 2.

Tandis qu’un test sur une unique itération donne la première méthode gagnante avec ~4E-05 secondes contre ~5E-05 pour les deux autres (à ce niveau c’est le array_flip pour transformer les valeurs en clés qui coute cher).

Conclusion

À moins d’avoir toujours très peu d’itérations (moins de 5), la méthode passant par array_flip() puis isset() est d’assez loin la meilleure (environ quatre fois plus rapide sur des grands nombres et pas plus lente sur des petits).

En passant, on remarque aussi qu’avec cette méthode, rechercher une valeur qui n’existe pas dans le tableau est plus rapide que de rechercher la première valeur du tableau, même si je ne vois pas forcément trop pourquoi :pense:

  • Print this article!
  • Turn this article into a PDF!
  • E-mail this story to a friend!
  • Facebook
  • Twitter
  • del.icio.us
  • Digg
  • Google Bookmarks
  • BlogMemes Fr
  • Wikio FR
  • Netvibes

Quelques trucs sur PHP #2

Samedi 31 janvier 2009

Une deuxième série de petits trucs sur PHP…

Page blanche

Plus j’utilise PHP, plus je me rends compte qu’il y a quand même des trucs bien foireux dedans… Notamment ceci : lorsqu’une classe contient deux définitions de la même méthode (du moins dans certains cas, j’ai pas trop approfondi pour voir si c’est vraiment systématique), on n’obtient pas d’exception, ni même la traditionnelle “fatal error” non-catchable et sans trace, mais bel et bien une page blanche sans aucune explication \o/ J’imagine que derrière PHP doit mourir lamentablement sur un “Segmentation fault”… Bref, quand vous obtenez une page blanche, pensez à vérifier si vous n’avez pas raté un copier/coller quelque part…

Duplication de tableaux

Après avoir tenté en vain de dupliquer un tableau avec le mot-clé clone (qui retourne null), j’ai cherché un peu et je suis tombé sur cet article. Donc apparemment une simple affectation suffit à dupliquer un tableau (ce qui explique au passage certaines choses concernant la quantité astronomique de mémoire qu’arrive à bouffer PHP dans certains cas) ! Comme quoi même en utilisant un langage pendant des années, on peut passer à côté de certains trucs de base…

L’instruction continue

Je parlais il y a quelque temps de l’instruction break qui admet un paramètre permettant de sortir de plusieurs boucles imbriquées d’un coup, eh bien l’instruction continue se comporte de la même façon.

Je n’avais pas insisté dessus à l’époque (parce que dans le cas du break, c’est évident) mais dans les deux cas, un switch est considéré comme une boucle. Donc si vous êtes dans un switch contenu dans une boucle et que vous voulez passer à la prochaine itération de la boucle il faut appeler un continue 2;.

Pour plus de détails sur l’instruction continue, rendez-vous sur le manuel officiel de PHP.

  • Print this article!
  • Turn this article into a PDF!
  • E-mail this story to a friend!
  • Facebook
  • Twitter
  • del.icio.us
  • Digg
  • Google Bookmarks
  • BlogMemes Fr
  • Wikio FR
  • Netvibes