Manuel PHP
Précédent | Chapitre 11. 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. Voir les fonctions utf8_encode() et utf8_decode() pour un support 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 11-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 'Êtes-vous sûr de vouloir effacer le dossier C:\\*.*?';
// affiche : Êtes-vous sûr de vouloir effacer le dossier C:\*.*?
echo 'Êtes-vous sûr de vouloir effacer le dossier C:\*.*?';
// affiche : Êtes-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
echo 'Les variables ne seront pas $afficher $ici';
// affiche : Les variables ne seront pas $afficher $ici
?>`

### Guillemets doubles

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

Tableau 11-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. Avant PHP 5.1.1, l'anti-slash dans \{$var} n'était pas affiché.

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, puis l'identifiant initial pour terminer la séquence.

L'identifiant fermant doit commencer à la première colonne de la 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 d'espacement ou de tabulation avant ou après le point virgule. Il est également important de noter que le premier caractères avant l'identifiant de fermeture doit être une nouvelle ligne, tel que définie par votre système. Par exemple, ce sera \r sous Macintosh. Le délimiteur de fermeture (suivi éventuellement d'un point-virgule) doit également être suivi par d'un caractère de nouvelle ligne.

Si cette règle n'est pas respectée et que l'identifiant de fermeture n'est pas correct, alors, il ne sera pas considéré comme un identifiant fermant et PHP continuera d'en chercher un. Si dans ce cas aucun identifiant de fermeture n'est trouvé, une erreur d'analyse sera émise, contenant comme numéro de ligne la fin du script.

Il n'est pas autorisé d'utiliser la syntaxe "Heredoc" lors de l'initialisation des membres d'une classe. Utilisez une autre syntaxe pour les chaînes à la place.

Exemple 11-13. Exemple incorrect

`<?php class foo { public $bar = <<<EOT bar EOT; } ?>`

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 11-14. 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ères 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 11-15. Utilisation des accolades {} dans les chaînes

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

De la même façon, vous pouvez 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 d'astuce comme cela pour les variables simples.

Exemple 11-16. 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 parce qu'elle serait obscure.

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. Vous pouvez utiliser "{\$" pour obtenir un "{$" littéral. Voici quelques exemples :

Exemple 11-17. 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) avec des crochets comme ceci : $str[42], donc, voyez une chaîne de caractères comme un tableau de caractères.

> Note : On peut également y accéder en utilisant des accolades comme ceci : $str{42} pour effectuer la même chose. Cependant, l'utilisation des crochets est préférable car l'utilisation des accolades est devenue obsolète depuis PHP 6.

Exemple 11-18. 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] = 'e';
// Méthode alternative utilisant des {}, obsolète depuis PHP 6
$third = $str{2};
?>`

## 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 pour plus de détails.

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. Lisez les sections du manuel sur les types et la définition du type pour comprendre plus facilement ce qui va suivre. Voir aussi la fonction settype().

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 décimaux).

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(). Pour voir un seul élément, vous devriez faire quelque chose comme : echo $arr['foo']. 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(). Depuis PHP 5, la méthode __toString() est utilisée si elle existe.

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 dans votre configuration de PHP.

## Conversion de chaînes de caractères

Lorsqu'une chaîne de caractères 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). Les données numériques valides ont un signe optionnel, suivies par un ou plusieurs digits (optionnellement, contenant un point de décimal), suivies par un exponentiel optionnel. L'exponentiel peut être un 'e' ou un 'E' suivi par un ou plusieurs digits.

Exemple 11-19. 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 = 4 + "10.2 gros cochons"; // $foo est du type float (14.2)
$foo = "10.0 cochons " + 1; // $foo est du type float (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 Unix à 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 11-20. Exemples de conversions

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

Ne vous attendez pas à récupérer le code d'un caractère en le convertissant en un entier (comme vous pourriez le faire en C par exemple). Utilisez les fonctions ord() et chr() pour convertir les caractères en leurs codes.

Précédent | Sommaire | Suivant
Les nombres décimaux | Niveau supérieur | Les tableaux