Meilleur pratique du PHP – Episode 1

Bonjour,

Aujourd’hui j’écris un tutoriel pour mieux connaitre le PHP. Je ne parlerait pas forcément de choses extrêmement compliqués, mais elles peuvent grandement simplifier la vie ou clarifier son code facilement ou encore vous permettre de mieux comprendre certaines choses.

Cet épisode est porté sur les chaines de caractères et contient deux parties.

Les arrays et les doubles quotes

Voici un problème récurent sur les forums PHP. Un débutant créer un script quelconque :

<?php
echo "La page demandée est : $_GET['page']";
?>

Et il se plein d’avoir l’erreur suivante, a priori incompréhensible :
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /var/www/tests/8.php on line 2

On leur dit alors qu’il faut utiliser la concaténation :

<?php
echo 'La page demandée est : '.$_GET['page'];
?>

Et là, le débutant tout content dit : ça marche :D
Mais tout le monde est maintenant persuadé qu’on ne peut pas utiliser les arrays dans une chaine délimitée par des doubles quotes, alors qu’il n’est pas beaucoup plus difficile de le faire qu’avec des variables simples.
Par exemple, testez ceci :

<?php
$array
('Bonjour''Au revoir');
echo 
"$array[1] monsieur";
?>

C’est quoi ce miracle? Ça marche o_O !

Ce n’est pas un miracle, c’est tout à fait normal. Regardez bien la différence entre les deux arrays insérés : $_GET['page'] et $array[1].

Euh, ça ne marche pas avec les variables super-globales?

Non, c’est pas ça! Bon, je vais être gentils, je vous donne un autre exemple (qui marche, bien sûr) :

<?php
echo "La page demandée est : $_GET[page]";
?>

Comme vous pouvez le voir, c’était les apostrophes qui envoyaient l’erreur ;)

Et si je veux utiliser cet array?

$array = array('\'chaine\''=>'truc');

Ça marchera pas ! :’(

Arf, si vous vous mettez à me poser des colles questions très intéressantes, on va vraiment avancer. En effet, ça ne marchera pas, mais il ne faut pas croire que l’on a atteint les limites du php. ^^ En fait, il existe une syntaxe particulière pour pouvoir écrire n’importe quel array, voire même retour de fonction dans une chaine délimitée par des doubles quotes.

En fait, ça consiste juste à entourer la variable ou l’array par des crochets : {$variable} ou {$array['clé']}.

Comme vous pouvez le voir, il faut, cette fois-ci, mettre des apostrophes pour délimiter la clé de l’array.

Un petit exemple pour la route :

<?php
$var 
'truc';
echo 
"la variable \$var a pour valeur : {$var}";

$array = array('machin''bidule');
echo 
"les deux valeurs de \$array sont : {$array[0]} et {$array[1]}";
?>

C’était pas trop compliqué? :)

Et pour écrire le résultat d’une fonction, on fait comment?

C’est un peu plus compliqué étant donné que {ta_fonction()} ne marche pas. Comme je n’ai pas envie de réécrire une explication qui a déjà été faite, je vous redirige sur ce tutoriel de vyk13 : Aller plus loin avec les variables – Les variables de fonctions

Accéder à un caractère particulier dans une chaine

Vous ne vous êtes jamais demandés comment récupérer le 5° caractère d’une chaine? C’est pas très dur. Il suffit de manipuler la chaine comme un array. Le premier caractère sera à l’index 0, le deuxième à l’index 1, etc :

<?php
$chaine 
'une chaine de caractère quelconque';
echo 
$chaine[0]; // affiche : u
echo $chaine[5]; // affiche : h
?>

Attention! Malgré les apparences, une chaine de caractère N’EST PAS un array! Utiliser foreach (et tout ce qui est spécifique aux arrays) sur une chaine créera une erreur!

De la même façon, on peut aussi modifier un caractère particulier d’une chaine :

<?php
$chaine 
'Il a un tic';
$chaine[9] = 'o';
echo 
$chaine// affiche : Il a un toc
?>

Attention, cela ne marche que pour modifier un seul caractère à la fois. Si vous faites

$chaine[8] = 'rat';

cela ne modifiera que le 8° caractère (une chaine commence par le caractère 0), la chaine deviendra donc ‘Il a un ric’ et pas ‘Il a un rat’.

J’en profite pour vous faire remarquer ceci :

<?php
$chaine 
'truc';
$chaine[9] = 'o';
echo 
$chaine// affiche : truc     o
?>


Comme vous pouvez le voir, la chaine est agrandie et des espaces sont rajoutés entre le caractère et la fin de l’ancienne chaine si vous essayez de modifier un caractère qui n’est pas dans la chaine.

Bien que cela semble fonctionner, il vaut mieux l’éviter. PHP nous le dit en nous envoyant la notice suivante : Notice:  Uninitialized string offset: 5 in /chemin/vers/le/fichier on line 3

Et, bien évidemment, si vous modifiez un caractère dont l’emplacement est négatif (par exemple $chaine[-1]), vous aurez droit à l’erreur suivante :

Warning:  Illegal string offset:  -1 in /chemin/vers/le/fichier on line 32

Attention, vous ne pouvez pas supprimer un caractère en utilisant unset, cela provoque une erreur fatale.

Par exemple :

<?php
$chaine 
'truc';
unset(
$chaine[3]);
?>

Vous affichera l’erreur suivante : Fatal error:  Cannot unset string offsets in /chemin/vers/le/fichier on line 2

2 commentaires

Poster un commentaire

Subscribe without commenting