Manuel PHP
Précédent | Chapitre 10. Les types | Suivant

# Les chaînes de caractères

Les chaînes de caractères sont des séquences de caractères. En PHP, un caractère est un octet, et il y en 256 de possibles. PHP n'a pas (encore?) de support natif d'Unicode.

> Note : La taille n'est pas un problème majeur pour une chaîne. Elle peut devenir très grande sans problème. Il n'y a pas à s'en faire pour cela.

## Syntaxe

Une chaîne peut être spécifiée de trois manières différentes :

- guillemets simples

- guillemets doubles

- syntaxe HereDoc

### Guillemets simples

Le moyen le plus simple de spécifier une chaîne de caractères est d'utiliser les guillemets simples : '.

Pour spécifier un guillemet simple littéral, vous devez l'échapper avec un anti-slash (\), comme dans de nombreux langages. Si un anti-slash doit apparaître dans votre chaîne ou bien en fin de chaîne, il faudra le doubler. Notez que si vous essayez d'échapper n'importe quel autre caractère, l'anti-slash sera conservé! Il n'y a pas besoin d'échapper d'autres caractères que le guillemet lui-même.

> Note : En PHP 3, une alerte sera affichée si cela arrive avec un niveau de rapport d'erreur de E_NOTICE.

> Note : Contrairement aux autres syntaxes, les variables présentes dans la chaîne ne seront PAS remplacées par leurs valeurs.

Exemple 10-12. Exemples d'interpolation des chaînes de caractères

`<?php
echo 'Ceci est une chaîne simple';
echo 'Vous pouvez inclure des nouvelles lignes dans une chaîne,
comme ceci.';
echo 'Arnold a coutume de dire : "I\'ll be back"';
// affiche : ... "I'll be back"
echo 'Etes vous sûr de vouloir effacer le dossier C:\\*.*?';
// affiche : Etes vous sûr de vouloir effacer le dossier C:\*.*?
echo 'Etes vous sûr de vouloir effacer le dossier C:\*.*?';
// affiche : Etes vous sûr de vouloir effacer le dossier C:\*.*?
echo 'Je suis en train de mettre une nouvelle ligne comme ceci : \n';
// affiche : Je suis en train de mettre une nouvelle ligne comme ceci : \n
?>`

### Guillemets doubles

Si la chaîne est entourée de guillemets doubles, PHP va comprendre certaines séquences de caractères :

Tableau 10-1. Les caractères spéciaux

Séquence | Valeur
--- | ---
\n | Nouvelle ligne (linefeed, LF ou 0x0A (10) en ASCII)
\r | Retour à la ligne (carriage return, CR ou 0x0D (13) en ASCII)
\t | Tabulation horizontale (HT ou 0x09 (9) en ASCII)
\\ | Anti-slash
\$ | Caractère $
\" | Guillemets doubles
\[0-7]{1,3} | Une séquence de caractères qui permet de rechercher un nombre en notation octale.
\x[0-9A-Fa-f]{1,2} | Une séquence de caractères qui permet de rechercher un nombre en notation hexadécimale.

Si vous essayez d'utiliser l'anti-slash sur n'importe quelle autre séquence, l'anti-slash sera affiché dans votre chaîne.

Le plus important pour les chaînes à guillemets doubles est le fait que les variables qui s'y trouvent seront remplacées par leur valeur. Voir la section sur le traitement des variables dans les chaînes pour plus de détails.

### Syntaxe Heredoc

Un autre moyen de délimiter les chaînes est d'utiliser la syntaxe dite "Heredoc" (en français, documentation ici): <<<, suivi d'un identifiant arbitraire, puis de la chaîne. Cette séquence se termine par l'identifiant initial, placé en premier sur une nouvelle ligne.

L'identifiant utilisé doit suivre les mêmes règles que les étiquettes PHP : il ne doit contenir uniquement que des caractères alpha-numériques, et des soulignés ("_"), et enfin, commencer par un caractère alphabétique ou un souligné.

Avertissement

Il est très important de noter que la ligne qui contient l'identifiant de fermeture ne doit contenir aucun autre caractère, hormis, éventuellement, un point-virgule ;. Cela signifie notamment que l'identifiant ne doit pas être indenté, et qu'il n'y a aucun caractère blanc entre le retour à la ligne et l'identifiant, ou bien entre l'identifiant et le ;.

Le plus dur est peut être qu'il ne faut pas qu'il y ait un retour à la ligne ((\r) à la fin de cette ligne, mais seulement un retour chariot (\n). Puisque Microsoft Windows utilise la séquence \r\n comme terminaison de ligne, la syntaxe heredoc risque de ne pas fonctionner là. Cependant, la plupart des éditeurs PHP fournissent une sauvegarde au format UNIX.

La syntaxe Heredoc se comporte exactement comme une chaîne à guillemets doubles, sans les guillemets doubles. Cela signifie que vous n'avez pas à échapper les guillemets (simples ou doubles) dans cette syntaxe. Les variables sont remplacées par leur valeur, et le même soin doit leur être apporté que dans les chaînes à guillemets doubles.

Exemple 10-13. Exemple de chaîne HereDoc

`<?php
$str = <<<EOD
Exemple de chaîne
s'étalant sur
plusieurs lignes
avec la syntaxe heredoc
EOD;
/* Exemple plus complexe, avec des variables. */
class foo {
var $foo;
var $bar;
function foo() {
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'MonNom';
echo <<<EOT
Mon nom est "$name". J'affiche des $foo->foo.
Maintenant, j'affiche un {$foo->bar[1]}.
Ceci se traduit par un 'A' majuscule : \x41
EOT;
?>`

> Note : Le support Here doc a été ajouté en PHP 4.

### Traitement des variables dans les chaînes

Lorsqu'une chaîne est spécifiée avec des guillemets doubles, ou en utilisant la syntaxe heredoc, les variables qu'elle contient sont remplacées par leur valeur.

Il y a deux types de syntaxe, une simple et une complexe. La syntaxe simple est la plus courante, et la plus pratique : elle fournit un moyen d'utiliser les variables, que ce soient des chaînes, des tableaux ou des membres d'objets.

La syntaxe complexe a été introduite en PHP 4 et peut être reconnue grâce aux accolades entourant les expressions.

#### Syntaxe simple

Dès qu'un signe dollar $ est rencontré, l'analyseur PHP va lire autant de caractère qu'il peut pour former un nom de variable valide. Entourez le nom de la variable avec des accolades pour indiquer explicitement son nom.

Exemple 10-14. Utilisation des accolades {} dans les chaînes

`<?php $boisson = 'vin'; echo "Du $boisson, du pain et du fromage!"; // OK, car "," n'est pas autorisé dans les noms de variables echo 'Il a goûté plusieurs ' . $boissons; // Pas OK, car 's' peut faire partie d'un nom de variable, et PHP recherchera alors $boissons echo "Il a goûté plusieurs ${boisson}s"; // OK ?>`

Similairement, vous pouvez aussi utiliser un élément de tableau, ou un membre d'objet. Pour les éléments de tableau, le crochet fermant ']' marquera la fin du nom de la variable. Pour les membres d'objets, les mêmes règles que ci-dessus s'appliquent. Cependant, il n'existe pas de truc comme pour les variables simples.

Exemple 10-15. Utilisation des accolades {} dans les chaînes pour les tableaux

`<?php
// Ces exemples sont spécifiques à l'utilisation de tableaux dans une chaîne.
// Lorsque vous êtes hors d'une chaîne, utilisez toujours des guillemets
// autour des index de tableau, et n'utilisez pas d'{accolades}.
// Affichons toutes les erreurs
error_reporting(E_ALL);
$fruits = array('fraise' => 'rouge', 'banane' => 'jaune');
// Fonctionne mais notez que cela fonctionne pas comme
// si cela était hors d'une chaîne
echo "Une banane est $fruits[banane].";
// Fonctionne
echo "Une banane est {$fruits['banane']}.";
// Fonctionne mais PHP cherche une constante appelée banane
// tel que décrit ci-dessous
echo "Une banane est {$fruits[banane]}.";
// Ne fonctionne pas, il manque les accolades. Cela donne une erreur d'analyse
echo "Une banane est $fruits['banane'].";
// Fonctionne
echo "Une banane est " . $fruits['banane'] . ".";
// Fonctionne
echo "Ce carré a un coté de $square->width mètres de large.";
// Ne fonctionne pas. Pour une solution, voyez la syntaxe complexe.
echo "Ce carré a un coté de $square->width00 centimètres.";
?>`

Pour tout ce qui sera plus compliqué, voyez la syntaxe complexe.

#### Syntaxe complexe

La syntaxe est dite "complexe" car elle permet l'utilisation d' expressions complexes, et non pas parcequ'elle serait obscure. Nuance.

En fait, vous pouvez inclure n'importe quelle valeur qui est dans l'espace de nom avec cette syntaxe. Il suffit d'écrire une expression exactement comme si elle était hors de la chaîne, puis de l'entourer d'accolades {}. Puisque vous ne pouvez pas échapper les accolades, cette syntaxe ne commence qu'à partir du signe dollar, qui suit immédiatement l'accolade ouvrante. Par exemple, vous pouvez utiliser "{\$" pour obtenir un "{$" littéral. Voici quelques exemples :

Exemple 10-16. Syntaxe complexe de chaîne

`<?php
// Affichons toutes les erreurs
error_reporting(E_ALL);
$super = 'fantastique';
// Ne fonctionne pas. Affiche : Ceci est { fantastique}
echo "Ceci est { $super}";
// Fonctionne. Affiche Ceci est fantastique
echo "This is {$super}";
echo "This is ${super}";
// Fonctionne
echo "Ce carré a un coté de {$square->width}00 centimètres.";
// Fonctionne
echo "Ceci fonctionne : {$arr[4][3]}";
// Ceci est faut pour la même raison que $foo[bar] est faux
// hors d'une chaîne. En d'autres terme, cela va fonctionne
// car PHP recherche d'abord une constante appelée foo, mais
// il générera une note E_NOTICE (undefined constant).
echo "Ceci est faux : {$arr[foo][3]}";
// Fonctionne. Lorsque vous utilisez un tableau multidimensionnel dans
// une chaîne, n'oubliez jamais les accolades.
echo "Ceci fonctionne : {$arr['foo'][3]}";
// Fonctionne
echo "Ceci fonctionne : " . $arr['foo'][3];
echo "Vous pouvez même écrire {$obj->values[3]->name}";
echo "Ceci est une valeur de variable variable : {${$name}}";
?>`

### Accès et modification des caractères d'une chaîne

Les caractères d'une chaîne sont accessibles et modifiables en spécifiant leur offset (le premier caractère est d'offset 0) entre accolade, après le nom de la variable.

> Note : Pour assurer la compatibilité ascendante, vous pouvez toujours accéder aux caractères avec des crochets. Mais cette syntaxe est obsolète en PHP 4.

Exemple 10-17. Exemples de chaînes

`<?php // Lit le premier caractère de la chaîne $str = 'Ceci est un test.'; $first = $str{0}; // Lit le troisième caractère de la chaîne $third = $str{2}; // Lit le dernier caractère de la chaîne $str = 'Ceci est un test.'; $last = $str{strlen($str)-1}; // Modifie le dernier caractère de la chaîne $str = 'Ceci est un test.'; $str{strlen($str)-1} = '!'; ?>`

## Fonctions et opérateurs pratiques

Les chaînes peuvent être concaténées avec l'opérateur '.' (point). Notez que l'opérateur d'addition '+' (plus) ne fonctionnera pas. Reportez-vous à la section opérateurs de chaînes.

Il y a une grande quantité de fonctions pratiques pour modifier les chaînes.

Reportez-vous à la section chaînes de caractères pour les fonctions les plus générales, à Expressions rationnelles Perl et Expressions rationnelles POSIX étendues pour les recherches et remplacements.

Il y a aussi les fonctions sur les URL, ainsi que des fonctions de chiffrage (mcrypt et mhash).

Finalement, si vous ne trouvez toujours pas votre bonheur, il y a les fonctions de types de caractères.

## Conversion en une chaîne de caractères

Vous pouvez convertir une valeur en une chaîne de caractères en utilisant l'opérateur (string), ou bien la fonction strval(). La conversion en chaîne de caractères est automatiquement faite dans toutes les situations qui nécessitent une chaîne de caractères. Cela arrive lorsque vous utilisez des fonctions comme echo() ou print(), ou encore lorsque vous comparez une valeur avec une chaîne de caractères.

Le booléen `TRUE` est converti en la chaîne de caractères "1", et le booléen `FALSE` est représenté par la chaîne de caractères vide "". De cette façon, vous pouvez convertir des booléens en chaîne de caractères et vice-versa.

Un entier ou un nombre à virgule flottante est converti en une chaîne de caractères qui représente ce nombre en décimal (y compris l'exposant des nombres à virgule flottante).

Les tableaux sont toujours convertis en la chaîne de caractères "Array", ce qui fait que vous ne pouvez pas afficher le contenu d'un tableau avec la fonction echo() ou print(). Voyez les informations ci-dessous pour plus de conseils.

Les objets sont automatiquement convertis en la chaîne de caractères "Object". Si vous souhaitez afficher le membre d'un objet, lisez le paragraphe ci-dessous. Si vous voulez connaître le nom de la classe de cet objet, utilisez la fonction get_class().

Les ressources sont toujours converties en chaîne de caractères "Resource id #1" où 1 est le nombre unique représentant la ressource, assigné par PHP au moment de l'exécution. Si vous souhaitez connaître le type d'une ressource, utilisez get_resource_type().

`NULL` est toujours converti en une chaîne de caractères vide.

Comme vous pouvez le voir, afficher des tableaux, des objets ou des ressources n'est pas pertinent par cette méthode. Reportez-vous aux fonctions print_r() et var_dump() pour avoir des outils plus pratiques.

Vous pouvez aussi convertir des valeurs PHP en chaînes pour les sauver dans un stockage. Cette méthode est appelée la linéarisation, et peut être exploitée avec la fonction serialize(). Vous pouvez aussi linéariser des valeurs PHP en structure XML si vous avez le support WDDX.

## Conversion de chaînes de caractères

Lorsqu'une chaîne de caractère est évaluée comme une valeur numérique, le résultat et le type de la variable sont déterminés comme suit.

La chaîne de caractères est de type "double" si elle contient un des caractères '.', 'e' ou 'E'. Sinon, elle est de type entier ("integer").

La valeur est définie par la première partie de la chaîne. Si la chaîne de caractères débute par une valeur numérique cette valeur sera celle utilisée. Sinon, la valeur sera égale à 0 (zéro).

Lorsque la première expression est une chaîne de caractères, le type de la variable dépend de la seconde expression.

Exemple 10-18. Exemples de conversions automatiques

`<?php
$foo = 1 + "10.5"; // $foo est du type float (11.5)
$foo = 1 + "-1.3e3"; // $foo est du type float (-1299)
$foo = 1 + "bob-1.3e3"; // $foo est du type integer (1)
$foo = 1 + "bob3"; // $foo est du type integer (1)
$foo = 1 + "10 petits cochons"; // $foo est du type integer (11)
$foo = 1 + "10 gros cochons"; // $foo est du type integer (11)
$foo = "10.0 cochons " + 1; // $foo est du type integer (11)
$foo = "10.0 cochons " + 1.0; // $foo est du type float (11)
?>`

Pour plus d'informations sur les conversions de type, voir les pages de man à propos de la fonction strtod(3).

Si vous voulez tester l'un des exemples de cette section, vous pouvez faire un copier/coller et l'insérer dans un script pour voir comment il se comporte.

Exemple 10-19. Exemples de conversions

`<?php echo "\$foo==$foo; type is " . gettype( $foo ) . "<br />\n"; ?>`

Précédent | Sommaire | Suivant
Les nombres à virgule flottante | Niveau supérieur | Les tableaux