Malgré son apparente simplicité, voici un bel exemple qui montre qu'une bonne connaissance des subtilités du langage PHP s'avère très importante :
in_array(0, array('A','B','C')); // Retourne TRUE !!Cette instruction montre que pour PHP, le nombre 0 se trouve bien dans le tableau ne comportant que des chaînes de caractères. Bien que cela puisse paraître surprenant, ce comportement est tout à fait normal. Pour le comprendre, il faut se souvenir de la manière dont PHP réalise les comparaisons entre valeurs de types différents. PHP étant un language faiblement typé, pour pouvoir comparer ce qui est comparable, il doit parfois réaliser implicitement des conversions de type (transtypage, ou casting) sur l'une des 2 opérandes. Ainsi, dans le cas d'une comparaison nombre/chaîne, il est important de savoir que c'est toujours la chaîne qui est implicitement castée en nombre.
// cette condition sera vérifiée echo (0 == 'A') ? 'TRUE' : 'FALSE'; // car elle est identique à echo (0 == (int)'A') ? 'TRUE' : 'FALSE';Et comme on sait que le casting d'une chaîne non numérique en un nombre retournera tout logiquement la valeur 0, voilà notre condition vérifiée !
Bien entendu, une comparaison stricte à l'aide de l'opérateur "triple égal" nous aurait offert le résultat initialement attendu puisqu'il réalise une comparaison aussi bien les valeurs que sur les types.
// cette condition ne sera pas vérifiée echo (0 === 'A') ? 'TRUE' : 'FALSE';Il faut aussi savoir que la fonction in_array possède elle même le moyen de réaliser cette comparaison stricte car elle accepte un dernier paramètre optionnel qui permet d'activer ou non cette fonctionnalité. Non activée par défaut, il nous aurait fallu écrire dès le départ :
in_array(0, array('A','B','C'), true); // Retourne FALSEPour conclure, outre le fait que profiter du confort offert par le faible typage de PHP ne se fait pas sans une extrême vigilance, j'ajouterai qu'avant d'accuser le langage d'un nouveau bug, il est peut-être utile d'envisager une éventuelle défaillance du programmeur ;)
Liens utiles
Vivement attendue, la release 1.5 du célèbre framework signé Zend Technologies débarque en version finale. Une sortie toute fraiche dont j'attendais impatiemment l'arrivée avant de me lancer dans l'apprentissage de ce framework, choisi après mûre réflexion parmi les nombreux autres prétendants très convaincants qui se bousculent au portillon. Voilà, maintenant plus d'excuses, va falloir s'y mettre !
En explorant les onglets du site officiel de Mootools, j'ai découvert cet astucieux petit trick CSS. Il permet de mettre en place un effet de "rollover" (changement d'image au passage du curseur de la souris) en utilisant une seule image source pour les différents états possibles (inactif/actif/survolé). Il s'agit en réalité d'une image composée des 3 états de l'onglet disposés l'un au dessus de l'autre. L'astuce consiste alors à afficher cette image en arrière-plan de l'onglet, et de la faire coulisser verticalement en CSS via la propriété background-position pour ne faire apparaître que l'état souhaité. Fallait y penser !
ul#menu li a { background-image: url(tab.gif); background-repeat: no-repeat; background-position: center left; } ul#menu li a:hover { background-position: top left; } ul#menu li a.selected, ul#menu li a:active { background-position: bottom left; }
Liens utiles
Cette petite fonction à l'allure peu digeste permet de transformer un tableau PHP en un tableau Javascript. Rien de bien formidable en soi, mais elle à tout de moins le mérite de gérer correctement les tableaux multidimensionnels de façon récursive, les valeurs NULL, booléennes ou non numériques. C'est pas du grand art, mais c'est simple et efficace.
public static function writeArray($aInput, $jsVarName, $eol=PHP_EOL) { $js = $jsVarName.'=new Array();'.$eol; foreach ($aInput as $key => $value) { if (!is_numeric($key)) { $key = '"'.$key.'"'; } if (is_array($value)) { $js .= self::writeArray($value, $jsVarName.'['.$key.']', $eol); } else { if (is_null($value)) { $value = 'null'; } elseif (is_bool($value)) { $value = ($value) ? 'true' : 'false'; } elseif (!is_numeric($value)) { $value = '"'.$value.'"'; } $js .= $jsVarName.'['.$key.']='.$value.';'.$eol; } } return $js; }
Travaillant sur un petit système de correction orthographique online, je me suis penché sur la réalisation d'une classe PHP qui permettrait d'obtenir toutes les combinaisons qu'il pourrait résulter d'une faute de frappe lors de l'encodage d'un mot au clavier. L'algorithme se base sur l'adjacence des touches du clavier (azerty et qwerty supportés) pour ne proposer que les fautes de frappe les plus probables dues à la maladresse humaine. Il est par exemple peu fréquent d'encoder un "s" alors qu'on vise un "k", ces deux touches étant complètement opposées.
<?php $clumsy = new ClumsyTyper(); print_r($clumsy->getMistypedString('sexy'')); ?>Va afficher :
Array ( [0] => zexy [1] => eexy [2] => qexy [3] => dexy [4] => wexy [5] => xexy [6] => szxy [7] => srxy [8] => ssxy [9] => sdxy [10] => sesy [11] => sedy [12] => sewy [13] => secy [14] => sext [15] => sexu [16] => sexg [17] => sexh )Bien évidemment, certains petits filous auront vite cerné l'utilité de cette classe dans d'autres domaines complètement machiavéliques tels que le typosquatting (ou URL hijacking), la génération massive de mots clés (Massive keyword list), et tout un tas de trucs avec des noms qui font très peur, à essayer avec prudence dans un but purement éducatif, bien entendu !
<<< Articles plus récents | Articles plus anciens >>>