Webmaster Hub
Rechercher dans les publications Rechercher:

Imprimer cet article

Rechercher dans les publications Auteur : Cariboo
Site Web :
Pnambique

Directeur du Pôle Experts de la société @position http://www.aposition.com

Articles de l'auteur :
La détection du Link Spam : un challenge pour les moteurs [3/4]
La détection du Link Spam : un challenge pour les moteurs [2/4]
La détection du Link Spam : un challenge pour les moteurs [Bibl.]
La détection du Link Spam : un challenge pour les moteurs [1/4]
Cuill veut surpasser Google grâce à l’analyse de données sémantiques
2007 : l’année des moteurs furtifs
L’autre sémantique - Le Web Sémantique et les systèmes de recherche d’information. [3.4]
L’autre sémantique - Le Web Sémantique et les systèmes de recherche d’information. [3.3]
L’autre sémantique - Le Web Sémantique et les systèmes de recherche d’information. [3.2]
L’autre sémantique - Le Web Sémantique et les systèmes de recherche d’information. [3.1]
Joachim Kreibich (Seekport) : pour nous, un moteur de recherche de qualité doit tenir compte des particularismes linguistiques nationaux, voire régionaux
Une tentative de définition du spamdexing
Google Base dévoilé !
Les concepts de la POO
La programmation objet : qu’est-ce que c’est ? à quoi ça sert ?
Gregory Olivier "MSN Search cherche à établir un véritable dialogue avec les webmasters et les référenceurs"
Direct Answers from Encarta
MSN Search utilise-t’il l’analyse au niveau des blocs ?
Spyware : les méthodes pour s’en débarasser
Michael James, de la société Mirago "Nous misons sur nos partenaires pour développer notre visibilité"
La sémantique appliquée et les outils de recherche [2/6]
Linguistique statistique et sémantique appliquée : outil de pertinence pour les moteurs, de KM et de référencement
ANALYSE THEMATIQUE (4/4) par le Pr E. Garcia
ANALYSE THEMATIQUE (3/4) par le Pr E. Garcia
Applications des outils sémantiques au référencement et aux moteurs de recherche
Sémantique appliquée : Liens et références bibliographiques
ANALYSE THEMATIQUE (2/4) par le Pr E. Garcia
ANALYSE THEMATIQUE (1/4) par le Pr E. Garcia
CIRCA : la technologie d’Applied Semantics au coeur des Adwords et des Adsense de Google [3]
Mon premier programme en PHP (3e Partie)
CIRCA : la technologie d’Applied Semantics au coeur des Adwords et des Adsense de Google [2]
CIRCA : la technologie d’Applied Semantics au coeur des Adwords et des Adsense de Google [1]
Quelques pistes pour comprendre le nouvel algorithme de Google (suite et fin)
Quelques pistes pour comprendre le nouvel algorithme de Google
FOOXX, le moteur futé venu d’Allemagne
Le futur moteur que prépare Microsoft pour MSN sera-t’il Brilliant ?
Mooter, un moteur de recherche innovant venu d’Australie
Les techniques évoluées d’indexation dans les moteurs de recherche (2e partie)
Visibilité et stratégies de développement d’audience sur le Web
Les techniques évoluées d’indexation dans les moteurs de recherche
L’algorithme HITS et le projet CLEVER (deuxième partie)
L’algorithme HITS et le projet CLEVER
La structure du web est en forme de "noeud papillon"
Webfountain d’IBM
Vers un moteur de recherche sensible au contexte (1ère partie)
Vers un moteur de recherche sensible au contexte (2ème partie)
Vers un moteur de recherche sensible au contexte (3ème partie)
Droit d’auteur et site web
Droit d’auteur et site web (2e Partie)
Droit des producteurs de bases de données (législation française)
Tester correctement variables et valeurs en php
Mon premier programme en PHP (2e Partie)
Les nouveautés de la version 5 de PHP
Les origines du PHP
Mon premier programme en PHP
Pourquoi choisir le PHP pour réaliser des pages dynamiques ?
Tester correctement variables et valeurs en php

[niveau : confirmé/expert]

Tester correctement variables et valeurs en php

Les problèmes de typage et de transtypage

7 septembre 2003, par Cariboo

Certains avantages du php, comme sa gestion très relâchée des types de variables, ont aussi quelques inconvénients. Mais une fois que l’on sait éviter et détecter ces problèmes, il est possible d’utiliser à son profit certaines particularités du langage pour écrire des scripts très puissants...

Comment prévenir les bogues dues aux problèmes de typage ?

En php, chaque variable peut changer de type en cours de route. Ce qui a pour conséquence de rendre le résultat de certains tests d’égalité imprévisibles

Bogues de comparaison entre types différents
Voici un bout de code courant qui peut poser problème


    if ($var==0){}

Si $var contient la chaine ’123’ au lieu du nombre 0, cette expression est considérée comme toujours vraie...

Solution : il faut donc penser à utiliser l’opérateur d’égalité === qui vérifie à la fois que les valeurs sont égales et qu’on ne compare pas des carottes et des navets

Bogues de typage des valeurs retournées par une fonction

Il arrive fréquemment que des fonctions renvoient une valeur numérique ou une chaine lorsque tout va bien, et le booléen "false" en cas d’échec : le résultat peut être ambigu... Exemple :


    if (fonctionquelconquerenvoyantunechaine($chaine)=="false"){}

Ce code fonctionne à peu près bien en php3. Sauf quand la chaine renvoyée se trouve être "false" (bogue subtile).

En php4, si on écrit


    if (fonctionquelconquerenvoyantunechaine($chaine)== false){}
Ce code peut toujours renvoyer false !

A l’inverse, le code :


    if (fonctionquelconquerenvoyantunechaine($chaine)=== true){}
ne fonctionnera pas correctement non plus, puisque le type peut être tantôt booléen, tantôt une chaine !

Un exemple plus spectaculaire


    $var = true ;
    if( $var == "true" ) echo("C'est vrai !"); // la chaine true est vraie car non vide donc le test d'égalité renvoie vrai !
    if( $var == "false" ) echo("C'est faux !") // même chose, sauf que là, l'affichage devient plus étonnant
    if( $var == "caribou" ) echo("C'est un cariboo !"); // cela marche avec n'importe qu'elle chaîne
    if( $var == 4 ) echo("C'est le nombre 4!") ; // cela marche aussi avec un type numérique. 4 est vrai !
donne à l’écran

    C'est vrai !
    C'est faux !
    C'est un caribou !
    C'est le nombre 4 !
Solution : éviter les comparaisons inutiles entre booléens et valeurs true et false. Préférer if(!fonction($param)){$chaine=fonction($param);} à if(fonction($param)== true){$chaine=fonction($param);}.

Attention : de plus, plusieurs fonctions, qui renvoyaient une chaine "false" en cas de problème en php3, envoient un booléen false en php4, ce qui empêche certains scripts mis au point en php3 de tourner en php4

Comportement atypique des valeurs booléennes

Par ailleurs, pour des raisons obscures (au moins pour moi), le booleen "false/true" est stocké sous la forme d’un entier égal à 1 si la valeur est true, tandis que (en php3) la valeur false est stockée parfois sous la forme de l’entier 0, la valeur "null", ou la chaine ’’. Dans les versions récentes de php, ces ambiguïtés disparaissent.

Dans la pratique, cela n’a pas d’incidence notable dans les calculs, compte tenu de la conversion automatique des types en php. Ce qui fait que dans la pratique, si $exp1 est true et $exp2 est false, les calculs booléens suivants donnent les résultats attendus :
$exp1 * $exp2 est évaluée à 0 (false)
$exp1 + $exp2 est évaluée à 1 (true)

Mais il est intéressant de connaître cette particularité, car dans certains cas, le transtypage donne des résultats qui peuvent sembler étonnants, où les fonctions de conversion de type renvoyer des messages difficiles à comprendre sinon.

Par ailleurs, pour les transtypages, il est interessant de savoir comment s’évaluent différentes valeurs si elles sont converties en type booléen :

false -> false (heureusement !)
0 -> false
null -> false
0.0 -> false (attention : sources de bogues subtiles)
"" (chaîne vide) -> false
"0" -> false (attention : source de bogues subtiles)
tableau vide -> false
objet vide -> false
toutes les autres valeurs -> true

Donc 2 s’évalue comme true, et -1 aussi !

Solution générale : ne jamais utiliser d’égalité sans savoir à l’avance le type des variables ou des expressions comparées => utiliser les fonctions de test de typage avant

Utilisation de la valeur NULL

NULL est apparue avec le PHP4

NULL est une constante particulière. Affectée à une variable elle permet de "vider" celle-ci de sa (ses) valeurs. Elle reste déclarée, mais ne contient rien. Elle n’a plus son ancien type non plus (le type devient NULL).

Attention là aussi aux comparaisons entre valeurs dans le cas où une variable peut contenir la (non)valeur NULL

NULL == NULL est évalué true
NULL == FALSE est évalué true
NULL == TRUE est évalué false

Cette valeur NULL n’a rien à voir avec le NULL du langage SQL donc attention aux intuitions.

Par ailleurs, il est difficile de distinguer les variables de type NULL et les variables non déclarées ou supprimées avec unset()

Il faut utiliser le bon test


    //$var est NULL
    ($var) renvoie TRUE
    isset($var) renvoie FALSE
    empty($var) renvoie TRUE
    is_null($var) renvoie TRUE

    //$inexistante est une variable inexistante ou supprimée par unset()
    ($var) renvoie FALSE
    isset($inexistante) renvoie FALSE
    empty($novar) renvoie TRUE
    is_null($novar) renvoie "Undefined variable error"

nouveau comportement de unset()

La fonction unset($var) permet de supprimer la variable de l’environnement. La variable $var n’est plus déclarée après cela. C’est utile par exemple pour supprimer d’un seul coup toutes les valeurs d’un tablo, avant de le redéfinir avec des indices différents...

unset() était une fonction en php3. Ce n’est plus le cas en php4, c’est devenu une structure du langage. Donc le test suivant ne marche pas en php4


    if (unset($var)){}
Remarque : unset() ne fonctionne pas correctement au sein de fonctions avec des variables statiques. Les autres cases mémoires ne sont pas supprimées...

Philippe YONNET

Vous avez des questions ? Des réactions ? Vous avez remarqué une erreur ? Commentez l’article sur le forum Webmaster-hub