Cpm Affiliation : la régie publicitaire au Cpm

Bons plans PHP

Ce chapitre, un peu en décalage avec les autres, va vous présenter deux ou trois éléments qui flottent autour du PHP et qui sont très importants ! Ça ne vous aidera pas à devenir les dieux du PHP (sauf pour la partie sur le transtypage), mais ça vous aidera quand même.

Présenter son code, tout un art

Pour l'instant, les codes que je vous ai montrés étaient tous simples et très courts. Mais quand on commencera à s'amuser un peu plus, les scripts deviendront très vite bien plus longs, bien plus complexes. Et si vous ne savez pas présenter votre code, vous aurez beaucoup de mal à vous relire par la suite.

Pourquoi est-ce important de pouvoir se relire facilement ? Réfléchissez et imaginez que vous fassiez un script génial mais que vous le codiez comme des gorets. Vous l'oubliez quelques mois, et puis vous devez le retravailler pour l'une ou l'autre raison. Si votre code est bien présenté, bien commenté, vous pourrez directement reprendre votre travail, alors que si vous avez joué aux codeurs-gorets, vous perdrez un temps fou à essayer de vous comprendre, et parfois sans succès.

La première chose à faire, c'est d'indenter son code. Mais qu'est-ce que l'indentation ? L'indentation est une pratique qui vise à rendre le code source plus clair en rajoutant des tabulations, ou des espaces, pour bien séparer les blocs d'instructions. Voici deux codes, strictement identiques ; l'un est indenté, l'autre ne l'est pas.

Code PHP :

<?php

function create_cache_config()
{
$req = mysql::query('SELECT cfg_fieldname, cfg_fieldvalue FROM '
. $GLOBALS['cfg']['sql_prefix'] . 'config', IF_ERROR_DIE);
$tmp = '<?php' . EOL . '$cfg = array(' . EOL;
while($res = mysql::fetch_assoc($req))
{
if(ctype_digit($res['cfg_fieldvalue']))
$tmp .= "'" . $res['cfg_fieldname'] . "' => " . (int)$res['cfg_fieldvalue'] . ',' . EOL;
else
$tmp .= "'" . $res['cfg_fieldname'] . "' => '" . str_replace("'", "\'", $res['cfg_fieldvalue']) . "'," . EOL;
}
$tmp[strrpos($tmp, ',')] = ' ';
$tmp .= ');' . EOL;
if(!($file = fopen('./Cache/config.php', 'w')))
trigger_error('create_cache_config::error ~ Unable to open file ./Cache/config.php', E_USER_ERROR);
if(fwrite($file, $tmp) === false)
trigger_error('create_cache_config::error ~ Unable to write into file ./Cache/config.php', E_USER_ERROR);
fclose($file);
}

?>

Code PHP :

<?php

function create_cache_config()
{
$req = mysql::query('SELECT cfg_fieldname, cfg_fieldvalue FROM '
. $GLOBALS['cfg']['sql_prefix'] . 'config', IF_ERROR_DIE);
$tmp = '<?php' . EOL . '$cfg = array(' . EOL;
while($res = mysql::fetch_assoc($req))
{
if(ctype_digit($res['cfg_fieldvalue']))
$tmp .= "'" . $res['cfg_fieldname'] . "' => " . (int)$res['cfg_fieldvalue'] . ',' . EOL;
else
$tmp .= "'" . $res['cfg_fieldname'] . "' => '" . str_replace("'", "\'", $res['cfg_fieldvalue']) . "'," . EOL;
}
$tmp[strrpos($tmp, ',')] = ' ';
$tmp .= ');' . EOL;
if(!($file = fopen('./Cache/config.php', 'w')))
trigger_error('create_cache_config::error ~ Unable to open file ./Cache/config.php', E_USER_ERROR);
if(fwrite($file, $tmp) === false)
trigger_error('create_cache_config::error ~ Unable to write into file ./Cache/config.php', E_USER_ERROR);
fclose($file);
}

?>

Ne trouvez-vous pas le deuxième code beaucoup plus lisible ? En un seul coup d'œil, on sait où commence tel ou tel bloc d'instructions et où il finit. Et encore, j'ai choisi un exemple « simple » ! Quand vous imbriquerez des conditions, des boucles et autres joyeusetés les unes dans les autres, ça va vite devenir un joyeux bordel si vous n'indentez pas correctement.

Il existe plusieurs styles d'indentation, le K&R, le BSD/Allman, le GNU, etc. Aucun n'est réellement meilleur qu'un autre, ça dépend de vos goûts. Personnellement, j'ai opté pour le style BSD/Allman ; petit exemple :

Code PHP :

<?php

while($lala)
{
echo 'machin';
// blabla
}

?>

Le style BSD/Allman fait un retour à la ligne après les parenthèses du while pour mettre l'accolade ouvrante à la ligne qui suit. Vous êtes libres de choisir le style qui vous plaît. L'important, c'est d'en choisir un et de s'y tenir. Si vous mélangez les styles, ça serait encore pire que sans indentation.

Le second point très important, c'est le nom de vos variables. En effet, le nom d'une variable est un élément capital : s'il est trop long, ça serait embêtant à taper (par exemple $NombreDeMessagesParPage est un nom de variable certes très clair, mais d'une longueur affolante). Il faut donc vous limiter et ne pas exagérer.
Il ne faut cependant pas non plus tomber dans l'excès inverse. Si vous mettez des noms de variable trop courts, vous risquez de ne plus savoir ce qu'est telle ou telle variable (par exemple, $inf est un nom très court, mais ça ne me dit rien du tout).
Il vous faut donc trouver un juste milieu entre clarté et longueur. L'idéal, c'est d'avoir un style de variables. Prenez les mots que vous utilisez le plus souvent dans vos noms de variables, et trouvez des diminutifs. Par exemple, au lieu de Nombre, vous pouvez mettre Nb, au lieu de Information, mettez Info. Vous pouvez également supprimer tous les mots blancs comme « de », « par », etc.
Si je reprends l'exemple du $NombreDeMessagesParPage, ça donnerait $nb_mess_page. C'est bien plus court, mais c'est tout aussi lisible pour peu qu'on conserve toujours la même convention de nommage.

Les variables, voilà une drôle d'affaire, d'ailleurs. Vous vous êtes déjà demandés quand il était utile de créer une variable ?
Souvent, il arrive que l'on voie ce genre de script :

Code PHP :

<?php
function cube($nb)
{
$calcul = $nb*$nb*$nb;
return $calcul;
}

$cote = 5;
$volume = cube($cote);

echo 'Le volume d\'un cube de côté 5cm est ' . $volume;
?>

Quelqu'un peut-il me dire en quoi les variables $calcul, $cote et $volume sont utiles ?
Ce genre de variables, j'appelle ça des parasites. Toute variable prend une certaine place dans la mémoire du serveur ; plus il y a de variables, moins il y a de mémoire, plus le serveur est lent (bon, c'est un peu trop simpliste mais l'idée est là).
Quand vous savez que vous n'utiliserez pas une variable, ne la créez pas !
Souvent, les codeurs ont peur des arrays au début, alors on voit souvent des bouts de code comme ceux-ci :

Code PHP :

<?php
$max_size = $array['max_size'];
$min_size = $array['min_size'];
$max_width = $array['max_width'];
$min_width = $array['min_width'];
?>

Vous rigolez peut-être, mais beaucoup de codeurs font ça, et ça ne sert à rien. Vous créez des variables totalement inutiles et qui ralentissent le serveur. Dans la partie II de ce tutoriel, on verra bien plus d'exemples pratiques où l'on serait tenté de créer des variables inutiles ; mais pour le moment, retenez juste qu'il faut bien réfléchir avant de créer des variables. Voilà le script précédent sans variable inutile :

Code PHP :

<?php
function cube($nb)
{
return $nb*$nb*$nb;
}

echo 'Le volume d\'un cube de côté 5cm est ' . cube(5);
?>

Le rendu est le même, mais j'ai économisé trois variables inutiles !

Encore deux petits détails qui me font grimper au plafond quand je les rencontre sur des scripts : le premier concerne les chaînes de caractères délimitées par des guillemets. Vous savez que dans ces chaînes de caractères, les variables sont remplacées par leur valeur. Alors parfois, on a droit à ce genre de choses :

Code PHP :

<?php
$a = fonction_quelconque();
echo "$a";
?>

Qui dans la salle peut me donner une seule bonne raison de mettre des guillemets autour de $a ?
Ça ne sert à rien, le rendu sera strictement identique si on les enlève, et en plus ça sera bien plus performant. En effet, analyser la chaîne de caractères et éventuellement remplacer une variable par sa valeur, ça prend un temps fou ! Alors qu'afficher simplement une variable, ça va à une vitesse supraluminique.

Second détail : parlons de concaténation. Qui peut me dire où se trouve la bêtise dans ce script (hormis les variables inutiles, c'est pour l'exemple) ?

Code PHP :

<?php
$a = 5;
$b = 6;
$c = 11;

echo '' . $a . '+' . $b . '=' . $c . '';
?>

Pour ceux qui sont attentifs, ce sont ces deux chaînes vides ('') qui n'ont pas le moindre sens. À quoi ça sert de concaténer une chaîne vide ?
Prenons un exemple réel : imaginez que vous colliez des bâtonnets bouts à bouts ; à quoi cela servirait-il de coller un bâtonnet de taille nulle ? À part perdre du temps à le coller, ça ne sert à rien du tout.
Eh bien c'est pareil quand on concatène des chaînes vides : le PHP perd du temps à faire la concaténation alors que concaténer une chaîne vide ne modifie en rien l'autre chaîne !
Ça paraît stupide dit comme ça, mais beaucoup de gens font cette stupidité.

La bible du codeur PHP

Dans ce tutoriel, je vous ai déjà donné un ou deux liens vous renvoyant vers l'une ou l'autre partie du site http://fr.php.net. Mais qu'est donc ce site ?
Ce site est la version française de http://php.net, le site officiel du PHP Group, c'est-à-dire le groupe de personnes qui a créé et fait évoluer le PHP.

Ce site est une mine d'or. En théorie, pour devenir un bon codeur PHP (ou du moins, pour connaître tous les aspects techniques du langage), il vous suffit de parcourir ce site. Seulement, de prime abord, il paraît austère et peu attrayant. Je vais vous expliquer un peu comment vous en sortir.

Tout d'abord, quand vous arrivez sur ce site, regardez dans la liste de liens en haut. Vous pouvez voir Download, Documentation, Faq, etc. Le lien qui nous intéresse est Documentation. Quand vous cliquez dessus, vous arrivez sur une page en anglais. Ne soyez pas déstabilisés, on va retrouver le français dans peu de temps. Vous pouvez voir un tableau sur cette page, il y a les lignes Formats, View Online et Download. Ce qui nous intéresse, c'est de voir la documentation en ligne (sur le site du PHP Group) : on va donc regarder dans la ligne View Online (« voir en ligne », en français).
Il y a une liste des langues dans lesquelles la documentation a été traduite. Comme on parle français, on va cliquer sur le lien French en gras. Félicitations, vous voilà sur la table des matières de la documentation PHP ! C'est à partir de là que vous pouvez atteindre tous les articles de la documentation.

Vous pouvez voir que tout est classé par thème ; regardez par exemple le point III, Référence du langage. Si vous regardez les noms des pages de ce thème, vous devez les reconnaître. Fonctions, variables, expressions, structures de contrôle, on a vu tout ça dans ce tutoriel. Il y en a d'autres que l'on n'a pas vus, comme les références, les classes et les objets, mais ce n'est pas très important pour le moment.

Ce que je veux que vous compreniez, c'est que tout est classé par thème. Et donc, si vous cherchez quelque chose dans la documentation, la première chose à faire est de se demander quel est le thème de ce que vous cherchez.
Si je veux des informations sur le if(), je sais que c'est une structure de contrôle, j'irai donc voir dans le point III.16, les structures de contrôle.

Si vous cliquez sur ce lien, vous arriverez à une nouvelle table des matières : la table des matières des structures de contrôle. Eh oui, il y a beaucoup de structures, on les a donc toutes insérées dans des pages différentes pour ne pas tout mélanger.

Cliquez donc sur le lien du if et vous voilà face à la description de son rôle, de son fonctionnement, etc. Vous avez aussi des exemples de code : je vous invite à les tester ; bien souvent, ça vous aide à comprendre.
Si vous continuez à descendre dans la page, vous verrez parfois des notes (en rouge, en jaune) qui sont des ajouts, des précisions et que vous devez lire. Ça contient parfois des informations cruciales.
Encore un peu plus bas, vous avez des commentaires sur la page : ce sont des notes de lecteurs, tout comme vous, qui ont voulu apporter leur pierre à l'édifice. Les commentaires sont très souvent en anglais, donc si vous ne parlez pas anglais, ils ne vous aideront pas. Pour ceux qui parlent anglais, je vous invite à lire les notes des lecteurs. On peut y trouver des informations très pratiques.
Mais attention à ne pas accorder une confiance aveugle en ces notes, il peut y avoir de grosses erreurs (déjà vues plusieurs fois) ; vous devez donc toujours critiquer ce que vous lisez.

Maintenant qu'on a vu un peu ce qu'était la documentation (doc' pour les intimes), je vais vous montrer ce dont vous vous servirez le plus souvent : la liste des fonctions.
On a appris à faire des fonctions, mais il en existe déjà des tonnes, plus de mille !
Sachant cela, il est très important, avant de créer une fonction, de vérifier qu'elle n'existe pas déjà. Mais comment le savoir ?
C'est très simple, on va prendre un cas réel. On va imaginer que je veuille créer une fonction qui me calcule la racine carrée d'un nombre.
La première chose à faire, c'est de se demander quel est le thème de ma recherche. Je cherche une fonction, le thème est donc les fonctions. Je vais à la table des matières de la documentation, et je descends jusqu'au VI, La référence des fonctions.
Je sais que je cherche une fonction, mais qu'est-ce que je sais d'autre ? Je sais que les racines carrées, ça fait partie des mathématiques. Je vais donc chercher la table des matières des fonctions mathématiques.
Je regarde donc dans la liste et j'arrive sur le point LXXIX, Mathématiques. Cool, c'est ce que je veux. Je clique sur le lien et me voilà sur la table des matières des fonctions mathématiques.

Descendez un peu dans la page, et vous verrez la table des matières. Cette table liste l'ensemble des fonctions et donne une petite explication très succincte sur le rôle de chacune d'elle. Je vais donc chercher une section où l'on parle de racine carrée. Je cherche, je cherche encore et je tombe sur la fonction sqrt() dont la description est Racine carrée. Génial, il y a de grandes chances que ça soit ce que je cherche ! Je clique donc sur le lien et me voilà sur la page concernant la fonction sqrt().

Sur cette nouvelle page, vous avez plusieurs informations. Tout d'abord, en gros et en bleu, vous avez le nom de la fonction (ici, sqrt()).
Juste en dessous, vous avez des parenthèses avec un texte comme ceci par exemple : PHP 4, PHP 5. Ça vous indique pour quelles versions du PHP cette fonction existe. Si vous utilisez une version du PHP qui n'est pas indiquée entre ces parenthèses, vous aurez une erreur fatale. Vous pouvez avoir quelque chose de plus complexe comme : PHP 4 >= 4.3.0, PHP 5. Ça veut dire que la fonction est définie pour des version du PHP 4 à partir du PHP 4.3.0, et pour PHP 5.

Vous avez ensuite une nouvelle ligne contenant le nom de la fonction et une description succincte. Dans notre exemple, on voit sqrt - Racine carrée.

Vient ensuite un second grand titre en bleu, Description. Là, vous avez des informations plus complètes sur la fonction.
Tout d'abord, vous avez le prototype de la fonction, dans notre exemple :

Code console :

float sqrt ( float arg )

Mais comment lire ça ?
Tout d'abord, le premier mot, float. C'est le type de la valeur que la fonction vous renvoie, ici un float, un nombre à virgule donc. Souvenez-vous des types primitifs et des arrays. Il est possible que vous ayez le mot void ; si c'est le cas, ça veut dire que la fonction ne retourne aucune valeur.

Vient ensuite le nom de la fonction, ici sqrt().

Les parenthèses suivent, elles vont vous donner le nombre de paramètres et le type demandé. Dans le cas de sqrt(), il n'y a qu'un paramètre, un nombre à virgule, le nombre dont on veut calculer la racine carrée. Pour chaque paramètre, vous aurez un nom et un type. Certains types vous sont encore inconnus, comme mixed ou callback. Ces deux derniers types sont des pseudo-types, il n'existent pas réellement, c'est juste pour simplifier la lecture.
Voici les trois pseudo-types :

  • mixed : indique qu'on peut donner n'importe quel type pour l'argument ;
  • callback : indique qu'on doit donner le nom d'une fonction de callback ;
  • nombre : indique qu'on doit donner un nombre, entier ou non.

Pour les fonctions de callback, on verra ça plus tard, ne vous en faites pas.
Il est possible de voir certains arguments entre crochets ([]) ; ne soyez pas étonnés, ça veut simplement dire qu'ils sont facultatifs, vous n'êtes pas obligés de les renseigner (souvenez-vous, je vous ai montré comment créer des fonctions avec des arguments facultatifs).

Une fois le prototype lu et compris, vous tombez sur la description plus complète de la fonction. Veillez à bien la lire, c'est très important.

Dans le cas de la fonction sqrt(), il n'y a qu'un paramètre et on devine facilement à quoi il sert. Seulement, ce n'est pas le cas de toutes les fonctions. Prenons par exemple la fonction mysql_real_escape_string().

Regardez après la description, vous avez un nouveau grand titre : Liste des paramètres. Cette section va vous dire à quoi sert tel ou tel paramètre. Il est très important de lire cette section, c'est elle qui vous permettra de savoir comment utiliser la fonction.

La section qui suit vous parle de la valeur de retour, elle est également très importante. Imaginez le cas suivant : j'affecte à une variable le retour d'une fonction qui peut renvoyer soit un nombre, soit un booléen. Ensuite, j'utilise cette variable comme paramètre pour une fonction qui demande un nombre et rien d'autre. Que se passerait-il si, pour une quelconque raison, la première fonction renvoyait un booléen ? Vous auriez une erreur et la deuxième fonction planterait !
Les erreurs de ce genre sont très courantes (on verra un très bel exemple dans la partie II de ce tutoriel) ; soyez donc très prudents et vérifiez toujours le type de vos variables quand il n'est pas sûr (si une fonction peut retourner deux types et qu'il n'y en a qu'un qui vous convient, vous devez vérifier ce que renvoie la fonction avec un if, par exemple).

On continue de descendre et nouvelle section : les exemples. Comme je l'ai dit précédemment, ils sont très utiles et permettent de mieux appréhender la fonction ; n'hésitez donc pas à les essayer !

Le reste, c'est du connu, donc j'ai fini ! Vous savez maintenant comment trouver une fonction sans connaître son nom, alors si vous venez sur un forum pour demander si telle ou telle fonction existe, vous n'aurez plus d'excuse et vous serez flagellés publiquement. 

Bon, un autre cas peut se présenter : celui où vous connaissez le nom d'une fonction, mais vous ne savez pas ce qu'elle fait, ou comment elle le fait.
Souvent, la réponse à un problème tient en une fonction. La personne qui répond donne donc uniquement le nom de la fonction à la personne qui demande, ça lui suffira pour résoudre le problème. Malheureusement, cette personne n'a pas lu ce chapitre, et elle ne sait pas comment trouver le fonctionnement de la fonction : qu'est-ce qu'elle fait ? Elle poste un nouveau message pour demander comment on utilise la fonction. Plutôt triste, non ?
Dans cinq minutes, vous saurez comment ne plus avoir à poster ce genre de message inutile  .

Le site dont on parle depuis tantôt possède un outil très pratique : un moteur de recherche. Il vous suffit de taper le nom de la fonction dans le petit formulaire en haut à droite, et pan, vous tombez sur la description. Mais il y a mieux !
Vous pouvez accéder à la description de n'importe quelle fonction via le lien : http://fr.php.net/%s.
%s représente le nom de la fonction : ainsi, pour la fonction strpos() par exemple, on a : http://fr.php.net/strpos.
Mais ça ne s'arrête pas là : tapez math au lieu du nom d'une fonction, boum, vous tombez sur l'index des pages associées aux fonctions mathématiques  .

Petit bonus pour ceux qui utilisent Firefox : un raccourci bien pratique. Commencez par aller dans le menu Marque-pages, puis dans l'option Organiser les marque-pages. Ajoutez ensuite un marque-page via le bouton prévu à cet effet, donnez-lui le nom qui vous plaît, mettez http://fr.php.net/%s comme adresse Web et pour le mot-clé, écrivez quelque chose d'équivoque et de pas trop long (comme doc, par exemple). Enregistrez le tout et tapez doc strpos dans la barre d'adresse de Firefox : miracle, vous tombez sur la page qui décrit la fonction strpos().
Comme vous l'avez sans doute deviné, il vous suffit de changer ce qui suit le mot-clé doc pour atterrir sur la page concernée.

Et voilà, vous êtes amis avec la documentation : si vous suivez ces démarches, vous pourrez toujours trouver ce que vous y cherchez !

Le transtypage, c'est pratique

Depuis quelques chapitres déjà, je vous parle de quelque chose que le PHP fait très souvent : le transtypage.
C'est une action qui change le type d'une expression en un autre, et c'est indispensable.

Souvenez-vous de mon exemple avec l'addition : qui peut me dire combien ça fait 'Pomme' + 'Poire' ? 
Eh bien avec le transtypage, je peux vous répondre, ça fait 0 !

On peut transtyper des variables de deux façons : soit avec des opérateurs, soit avec des fonctions.
Je vais commencer par parler un peu des fonctions, les opérateurs suivront et la table de conversion fermera la marche.

Il y a trois fonctions qui permettent de transtyper une expression en un type bien précis : strval(), floatval() et intval().
Rien qu'en voyant le nom des fonctions, vous devriez comprendre qui fait quoi.
strval() transtype une expression en une chaîne de caractères, exemple :

Code PHP :

<?php

$var = 5;
var_dump($var);
$var = strval($var);
var_dump($var);

?>

Les var_dump() nous le confirment, on a bien transtypé notre variable !
Les deux autres fonctions s'utilisent de la même façon :

<?php
$var = '';
var_dump($var);
settype($var, 'int');
var_dump($var);
settype($var, 'bool');
var_dump($var);
settype($var, 'float');
var_dump($var);
settype($var, 'array');
var_dump($var);
settype($var, 'null');
var_dump($var);
settype($var, 'string');
var_dump($var);
?>

INFORMATION : Vous remarquez que je n'affecte pas la valeur de retour de la fonction à $var : en effet, settype() travaille directement sur la variable et non sur une copie. Mais on verra ça plus tard dans le chapitre sur les références.

Sous vos yeux ébahis, vous voyez le type de $var changer à tout bout de champ.

Malheureusement, settype(), j'aime pas. Pourquoi ? Parce qu'on modifie directement la variable.
Souvenez-vous de mon exemple de tantôt, avec une fonction qui peut retourner soit un nombre, soit un booléen, et une autre qui demande un nombre et rien d'autre.
Si je veux m'assurer d'avoir un nombre, je peux soit faire une condition, soit transtyper ma variable. Voici comment on ferait avec settype() :

Code PHP :

<?php

$var = fonction_une();
settype($var, 'int');
echo fonction_deux($var);

?>

Trois instructions et une variable inutile, plutôt laid, non ? Alors qu'avec les trois fonctions de départ...

<?php

echo fonction_deux(intval(fonction_une()));

?>

Plus court et plus sexy, que demander de mieux ?

Ben, en fait, il y a mieux ! Je n'aime vraiment pas m'user les doigts sur mon clavier et ça m'ennuie de taper intval($var). C'est l'heure de faire connaissance avec les opérateurs !

Je vais reprendre un code plus ancien et obtenir le même résultat en économisant mes doigts :

Code PHP :

<?php

$var = '';
var_dump($var);
var_dump((int)$var);
var_dump((bool)$var);
var_dump((float)$var);
var_dump((array)$var);
var_dump((string)$var);

?>

J'ai un peu menti : il manque le type NULL. Mais comme on ne transtype jamais une expression en un NULL, ça n'a aucune importance. Voilà donc un code plus court, plus simple.
Reprenons notre code plus sexy et rendons-le encore plus attirant :

<?php

echo fonction_deux((int)fonction_une());

?>

Et voilà, vous savez comment transtyper des expressions et des variables !

INFORMATION : La priorité de ces opérateurs est la même, ils sont tous moins prioritaires que les opérateurs ++ et --, mais plus prioritaires que les opérateurs *, / et %.

Ne nous arrêtons pas en si bon chemin : c'est bien de savoir transtyper, mais c'est mieux de savoir ce que donne le transtypage d'un type en un autre.

Transtypage en booléen

Pour commencer en douceur, on va transtyper tous les types connus en booléens. Comme vous le savez, le booléen vaut soit false, soit true.
Étant donné qu'il y a un nombre quasiment infini de valeurs qui donnent true, voici ce qui donne false quand on transtype une expression en un booléen :

  • le booléen false ;
  • l'entier 0 (zéro) ;
  • le nombre à virgule 0.0 ;
  • la chaîne vide '' et les chaînes '0' et "0" ;
  • un array vide (sans aucune association) ;
  • le type NULL.

Il vous suffit de tester pour vous en assurer. Toute autre valeur que celles-ci vaudra true après transtypage en booléen.

Transtypage en entier

Si on veut convertir un booléen en entier, l'entier vaudra 0 si le booléen vaut false et 1 si le booléen vaut true.
Si on veut convertir un float en entier, l'entier vaudra l'arrondi inférieur si le float est positif, mais s'il est négatif, l'entier vaudra l'arrondi supérieur (on arrondit vers le nombre le plus proche de 0).

Code PHP :

<?php

var_dump((int)4.65);
var_dump((int)-4.65);

?>

Si on veut convertir une chaîne de caractères en un entier, plusieurs cas sont possibles :

  • si la chaîne commence par un nombre ('0hello' ou '3.9lala' par exemple), l'entier résultant sera égal à la partie entière de ce nombre ;
  • si la chaîne ne commence pas par un nombre, l'entier résultant vaudra 0.

Pour les autres types (array, null, etc.), le transtypage en entier n'est pas défini, ça peut donner n'importe quoi. Toutefois, comme il est plutôt gentil, si vous voulez par exemple transtyper un array en entier, le PHP va d'abord transtyper l'array en booléen puis le booléen en entier.

Transtypage en nombre à virgule

Si vous transtypez un booléen en nombre à virgule, deux cas sont possibles : si le booléen vaut true, le float vaudra 1, sinon 0.
Si vous transtypez un entier en nombre à virgule, le float vaudra l'entier (logique, 1.0 est équivalent à 1).
Si vous voulez transtyper une chaîne de caractères en float, c'est exactement comme pour les entiers, ça dépend par quoi commence la chaîne.

ATTENTION : Ce nombre est un float : -1.3e3. C'est en fait une autre écriture pour (-1.3)*10^3.

Pour les autres types, c'est comme avec un entier.

Transtypage en chaîne de caractères

Si vous convertissez le booléen true en chaîne de caractères, vous obtenez la chaîne '1' ; si le booléen vaut false, vous obtenez une chaîne vide.
Si vous convertissez un entier ou un nombre décimal, vous obtenez une chaîne représentant ce nombre (c'est-à-dire une chaîne qui, transtypée dans le type de départ, donne la valeur de départ).
Si vous tentez de convertir un array en chaîne de caractères, vous obtiendrez la chaîne 'Array' (faites donc un echo array(); et vous venez de prouver que le PHP convertit l'expression en chaîne de caractères avant de l'afficher).
NULL est également converti en une chaîne de caractères vide ('').

Transtypage en array

C'est le cas le plus simple de tous : si vous transtypez un type en array, vous obtiendrez un array avec cette valeur comme valeur de l'association portant la clé 0.

Code PHP :

<?php

var_dump((array)1);
var_dump((array)'lala');
// etc.

?>

Et voilà, on en a fini avec le transtypage.
Drôlement costaud, ce PHP, vous ne trouvez pas ? 

Ce chapitre était certes long, mais pas très complexe. N'hésitez pas à venir le relire, c'est un bon mémo.

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

Infos Plan Partenaires
À propos Webmasters
C.G.U Services Gratuits Annuaire de sites web
Bannières Forum Ionoa

 

Aipoweb est un site édité par ASMOH NetWork  ©

Créer un site gratuit avec e-monsite - Signaler un contenu illicite sur ce site

×