23 déc 2010

Une (des nombreuses) bizarrerie de PHP

Category: UncategorizedRenaud @ 11h59

Je viens de tomber sur un bug qui m’a paru assez étrange au premier abord, mais qui, après réflexion est tout a fait « normal ».

Dans mon code, je testais l’égalité entre 2 chaines de caractères ("0000000123" et "000123") et ça me retournait true alors que j’attendais false.

En réfléchissant 2 minutes, voici ce que php effectue:

  1. est-ce que la chaine A est identique à la chaine B: non
  2. est-ce qu’en castant la chaine A et/ou B, j’arrive à trouver une égalité: oui

En effet, en castant les 2 chaines en entier, on obtient 123 et l’égalité est trouvée.

Comment faire alors pour que PHP retourne false ? En utilisant l’opérateur === qui teste non seulement l’égalité mais vérifie également qu’ils sont de même type. En réalité, ça teste l’égalité sans faire de cast. En conséquence de quoi, == est très légèrement plus lent que ===. En d’autres termes, si vous codez bien connaissez exactement le type de vos données, préférez === car il est plus rapide.

Mots-clefs : ,


07 juin 2007

Yakuake transparent uniquement sur le 1er onglet? Voici la solution

Category: UncategorizedRenaud @ 12h00

YakuakeEn effet, mon yakuake, tout beau qu’il puisse être, n’était transparent que sur le premier onglet. Les suivants étaient désespérément noirs.

Bon noir, c’est joli aussi… mais transparent, c’est plus mieux :)

Alors, j’ai pris mon courage à deux mains et mon clavier dans l’autre pour aller interroger Google. Cette fois-ci, il n’a pas été mon ami. Il ne m’a pas aidé du tout. Je cherche dans la documentation d’ubuntu-fr, pas mieux. Dans son forum? Oui ! Mieux, je m’aperçois qu’il s’agit d’un bug lié à Konsole et qui impacte Yakuake puisqu’il l’utilise.

Donc si comme moi, votre Konsole souffre de ne pas avoir tous ses onglets transparents, il vous suffit de supprimer le paquet scim-qtimm:

$ sudo apt-get remove --purge scim-qtimm

Fermer Konsole ou Yakuake, relancer le et admirer de vos yeux ébahis la transparence se faire.

Mots-clefs : , , , , , ,


10 mai 2007

date(‘d/m/Y’, strtotime(’0000-00-00′)) = ?

Category: UncategorizedRenaud @ 23h22

phpAllez, allez! Petite énigme de fin de semaine!

D’après vous, en PHP, que peut bien retourner
date('d/m/Y', strtotime('0000-00-00')), hein ?

Moi, au début, je pensais que ça allait me sortir EPOCH, donc quelque chose qui aurait dû ressembler à 01/01/1970.

Que nenni! Cela affiche 30/11/1999.

Ah… il a fallu chercher… et une fois trouvé, c’est tout à fait logique.

Cela part d’un bug PHP[1] du parser de PHP qui ne fait aucune différence entre l’année ’0′, ’00′, ’000′ ou ’0000′ et qu’il traduit inévitablement en l’an 2000. A partir de là, dans la gymnastique microprocessoromentale de PHP, il se passe les choses suivantes:

  • 0000-00-00 devient 2000-00-00
  • 2000-00-00 n’existe pas, il prend le 00 du mois et décide donc que c’est le mois précédent: 1999-12-00[2]
  • 1999-12-00 n’existe pas, il prend le 00 du jour et décide que c’est le jour précédent: 1999-11-30[3]

Nous voila donc propulsé fin novembre 1999.

Conclusion:

  • il vaut mieux avoir NULL plutôt que ’0000-00-00′ pour une date non utilisée
  • pour avoir rapidement la fin d’un mois, il suffit de se mettre au jour 00 du mois suivant. Exemple: si on veut le 31 aout 2010, il suffit d’avoir ’2010-09-00′, strtotime se chargera de revenir un jour en arrière.

Notes

[1] Contrairement à ce qui est écrit dans le rapport de bugs et ses commentaires, le bug existe toujours en PHP5

[2] De la même manière, si vous aviez le mois 13, il passerait à janvier de l’année suivante

[3] De la même manière, si vous aviez le 32 janvier, il passerait au 1er févier et si c’était le 40 janvier, vous arriveriez au 9 février.

Mots-clefs : , ,