Les cha�nes de caract�res
Une cha�ne de caract�res est une s�rie de caract�res. Avant PHP 6, un caract�re est la m�me chose qu'un octet. Ainsi, il y a exactement 256 caract�res diff�rents. Ceci impliquait �galement que PHP n'avait pas de support natif pour l'Unicode. Voir les fonctions utf8_encode() et utf8_decode() pour des fonctionnalit�s Unicode simples.
Note: Ce n'est pas un probl�me pour une cha�ne de caract�res de devenir tr�s grande. PHP n'impose pas de taille � une cha�ne de caract�res ; la seule limite est la m�moire disponible sur le syst�me sous lequel PHP s'ex�cute.
Syntaxe
Une cha�ne de caract�res litt�rale peut �tre sp�cifi�e de 4 fa�ons diff�rentes :
- Entour�e de guillemets simples
- Entour�e de guillemets doubles
- syntaxe Heredoc
- syntaxe Nowdoc (depuis PHP 5.3.0)
Entour�e de simple guillemet
La fa�on la plus simple de sp�cifier une cha�ne de caract�res est de l'entourer de guillemet simple (le caract�re ').
Pour sp�cifier un guillemet simple litt�ral, vous devrez l'�chapper d'un antislash (\). Pour sp�cifier un antislash litt�ral avant un guillemet simple, ou � la fin d'une cha�ne de caract�res, �chappez-le deux fois (\\). Notez que si vous tentez d'�chapper n'importe quel autre caract�re, l'antislash s'affichera.
Note: Contrairement aux 2 autres syntaxes, les variables et les s�quences �chapp�es des caract�res sp�ciaux ne seront pas trait�es lorsqu'elles seront dans une cha�ne de caract�res entour�e de simple guillemet.
<?php
echo 'ceci est une cha�ne simple';
echo 'Vous pouvez �galement ajouter des nouvelles lignes
dans vos cha�nes
de cette fa�on';
// Affiche : Arnold dit : "I'll be back"
echo 'Arnold dit : "I\'ll be back"';
// Affiche : Voulez-vous supprimer C:\*.*?
echo 'Voulez-vous supprimer C:\\*.*?';
// Affiche : Voulez-vous supprimer C:\*.*?
echo 'Voulez-vous supprimer C:\*.*?';
// Affiche : Ceci n'affichera pas \n de nouvelle ligne
echo 'Ceci n\'affichera pas \n de nouvelle ligne';
// Affiche : Les variables ne seront pas $traitees $ici
echo 'Les variables ne seront pas $traitees $ici';
?>
Entour�e de guillemet double
Si la cha�ne de caract�res est entour�e de guillemet double ("), PHP interpr�tera plus de s�quences �chapp�es pour les caract�res sp�ciaux :
S�quence | Signification |
---|---|
\n | Fin de ligne (LF ou 0x0A (10) en ASCII) |
\r | Retour � la ligne (CR ou 0x0D (13) en ASCII) |
\t | Tabulation horizontale (HT or 0x09 (9) en ASCII) |
\v | Tabulation verticale (VT or 0x0B (11) en ASCII) (depuis PHP 5.2.5) |
\f | Saut de page (FF ou 0x0C (12) en ASCII) (depuis PHP 5.2.5) |
\\ | Antislash |
\$ | Signe dollars |
\" | Guillemet double |
\[0-7]{1,3} | La s�quence de caract�res correspondant � une expression r�guli�re est un caract�re, en notation octal |
\x[0-9A-Fa-f]{1,2} | La s�quence de caract�res correspondant � une expression r�guli�re est un caract�re, en notation hexad�cimale |
De la m�me fa�on que pour les cha�nes entour�es de simple guillemet, l'�chappement de tout autre caract�re affichera l'antislash. Avant PHP 5.1.1, l'antislash de \{$var} n'�tait pas affich�.
La fonctionnalit� la plus int�ressante des cha�nes entour�es de guillemet double est que les noms de variables sont trait�s. Voir la documentation sur l'analyse des cha�nes de caract�res pour plus de d�tails.
Syntaxe Heredoc
Une 3�me fa�on de d�limiter une cha�ne de caract�res est la syntaxe Heredoc : <<<. Apr�s cet op�rateur, un identifiant est fourni, puis, une nouvelle ligne. La cha�ne elle-m�me suit, puis, le m�me identifiant pour fermer la notation.
L'identifiant doit commencer la premi�re colonne de la ligne. De plus, l'identifiant doit suivre les m�mes r�gles que n'importe quel libell� PHP : il ne doit contenir que des caract�res alphanum�riques et des soulign�s, et doit commencer par un caract�re non num�rique ou un soulign� ("underscore").
Il est tr�s important de noter que la ligne contenant l'identifiant ne doit contenir aucun autre caract�re, mise � part, �ventuellement, un point-virgule (;). Cela signifie que l'identifiant ne doit pas �tre indent�, et il ne doit y avoir aucun espace ou tabulation avant ou apr�s le point-virgule. Il est �galement important de garder � l'esprit que le premier caract�re avant l'identifiant de fermeture doit �tre une nouvelle ligne sur les syst�mes Unix, incluant Mac OSX (caract�re \n). Le d�limiteur de fermeture (pouvant �tre suivi d'un point-virgule) doit aussi �tre suivi d'une nouvelle ligne.
Si cette r�gle n'est pas respect�e et que l'identifiant de fermeture n'est pas "propre", il ne sera pas consid�r� comme identifiant de fermeture, et PHP continuera � en chercher un. Si un identifiant de fermeture "propre" n'est pas trouv� avant la fin du fichier courant, une erreur d'analyse sera �mise � la derni�re ligne.
Heredoc ne peut �tre utilis� pour initialiser les membres d'une classe. Depuis PHP 5.3, cette limitation ne s'applique qu'aux Heredoc qui contiennent des variables.
Exemple #1 Exemple invalide
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
?>
Heredoc se comporte exactement comme une cha�ne entour�e de double guillemet, sans avoir de double guillemet. Cela signifie que les guillemets dans une syntaxe Heredoc n'ont pas besoin d'�tre �chapp�s, mais les codes d'�chappement list�s ci-dessus peuvent toujours �tre utilis�s. Les variables seront trait�es mais les m�mes attentions doivent �tre prises lorsque vous utilisez des variables complexes dans une syntaxe Heredoc.
Exemple #2 Exemple de cha�nes Heredoc
<?php
$str = <<<EOD
Exemple de cha�ne
sur plusieurs lignes
en utilisant 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 = 'MyName';
echo <<<EOT
Mon nom est "$name". J'affiche quelques $foo->foo.
Maintenant, j'affiche quelques {$foo->bar[1]}.
Et ceci devrait afficher un 'A': \x41
EOT;
?>
L'exemple ci-dessus va afficher :
Mon nom est "MyName". J'affiche quelques Foo. Maintenant, j'affiche quelques Bar2. Et ceci devrait afficher un 'A' majuscule : A
Il est aussi possible d'utiliser la syntaxe Heredoc pour passer des arguments � une fonction :
Exemple #3 Exemple d'utilisation de Heredoc pour passer des arguments
<?php
var_dump(array(<<<EOD
foobar!
EOD
));
Depuis PHP 5.3.0, il est possible d'initialiser les variables statiques et les propri�t�s ou constantes de classes avec la syntaxe Heredoc :
Exemple #4 Utilisation de Heredoc pour initialiser des valerus statiques
<?php
// Variables statiques
function foo()
{
static $bar = <<<LABEL
Nothing in here...
LABEL;
}
// Constantes et propri�t�s de classe
class foo
{
const BAR = <<<FOOBAR
Constant example
FOOBAR;
public $baz = <<<FOOBAR
Property example
FOOBAR;
}
?>
PHP 5.3.0 introduit aussi la possibilit� pour Heredoc d'utiliser les guillemets doubles dans les d�clarations :
Exemple #5 Utilisation des guillemets doubles avec Heredoc
<?php
echo <<<"FOOBAR"
Hello World!
FOOBAR;
>
Note: Le support de la syntaxe Heredoc a �t� ajout� en PHP 4.
Nowdoc
Nowdoc est aux cha�nes entour�es de guillemet simple ce qu'Heredoc est aux cha�nes entour�es de guillemet double. Nowdoc est sp�cifi� de mani�re similaire � Heredoc, mut aucune analyse n'est effectu�e dans une syntaxe Nowdoc. La construction est id�ale pour embarquer du code PHP ou d'autres larges blocs de texte, sans avoir besoin d'�chapper quoi que ce soit. Cette syntaxe partage les m�mes fonctionnalit�s que le constructeur SGML <![CDATA[ ]]>, en ce qu'elle d�clare un bloc de texte qui ne doit pas �tre analys�.
Nowdoc est identifi� avec la m�me s�quence <<< utilis�e par Heredoc, mais l'identifiant qui suit est entour� de guillemet simple,e.g. <<<'EOT'. Toutes les r�gles concernant les identifiants Heredoc sont �galement appliquer aux identifiants Nowdoc, et tout sp�cialement, celles concernant l'apparence de l'identifiant.
Exemple #6 Exemple de cha�nes Nowdoc
<?php
$str = <<<'EOD'
Exemple de cha�ne
sur plusieurs lignes
en utilisant la syntaxe Nowdoc.
EOD;
/* Exemple complexe, avec des variables. */
class foo
{
public $foo;
public $bar;
function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'MyName';
echo <<<'EOT'
Mom nom est "$name". J'affiche quelques $foo->foo.
Maintenant, j'affiche quelques {$foo->bar[1]}.
Ceci ne devrait pas afficher un 'A': \x41
EOT;
?>
L'exemple ci-dessus va afficher :
Mom nom est "$name". J'affiche quelques $foo->foo. Maintenant, j'affiche quelques {$foo->bar[1]}. Ceci ne devrait pas afficher un 'A': \x41
Note: Contrairement � Heredoc, NowDoc peut �tre utilis� dans n'importe quel contexte de donn�es statiques. L'exemple typique est l'initialisation de membres ou de constantes de classe :
Exemple #7 Exemple avec des donn�es statiques
<?php
class foo {
public $bar = <<<'EOT'
bar
EOT;
}
?>
Note: Le support Nowdoc a �t� ajout� en PHP 5.3.0.
Analyse des variables
Lorsqu'une cha�ne de caract�res est sp�cifi� en guillemet double ou en Heredoc, les variables sont analys�es.
Il y a 2 types de syntaxe : une simple et une complexe. La syntaxe simple est la plus commune et la plus pratique. Elle fournit une fa�on d'embarquer une variable, un tableau ou un objet dans une cha�ne avec un minimum d'effort.
La syntaxe complexe a �t� introduite en PHP 4, et se reconna�t en l'utilisation d'accolades autour de l'expression.
Syntaxe simple
Si un signe dollars ($) est rencontr�, l'analyse prendra autant de caract�res que possible pour former un nom de variable valide. Si vous entourez un nom de variable par des accolades explicitement, alors le nom de la variable n'aura aucune ambigu�t�.
<?php
$beer = 'Heineken';
echo "$beer's taste is great"; // fonctionne ; "'" est un caract�re invalide pour les noms de variable
echo "He drank some $beers"; // ne fonctionne pas ; 's' est un caract�re valide dans un nom de variable et la variable est en fait "$beer"
echo "He drank some ${beer}s"; // fonctionne
echo "He drank some {$beer}s"; // fonctionne
?>
De la m�me fa�on, l'index d'un tableau ou la propri�t� d'un objet peut �tre analys�. Avec les indices d'un tableau, les crochets (]) forment la fin de l'index. Les m�mes r�gles sont appliqu�es aux propri�t�s d'objet comme pour les simples variables.
<?php
// Ces exemples sont sp�cifiques � l'utilisation des tableaux dans des cha�nes.
// Lorsqu'ils sont � l'ext�rieur d'une cha�ne, quottez toujours les cha�nes repr�sentant
// les cl�s du tableau et n'utilisez pas d'{accolades}.
// Montre toutes les erreurs
error_reporting(E_ALL);
$fruits = array('strawberry' => 'red', 'banana' => 'yellow');
// Fonctionne, mais notez que cela fonctionne diff�remment � l'ext�rieur d'une cha�ne
echo "A banana is $fruits[banana].";
// Fonctionne
echo "A banana is {$fruits['banana']}.";
// Fonctionne, mais PHP cherche une constante nomm�e banana en premier, tel que d�crit ci-dessous
echo "A banana is {$fruits[banana]}.";
// Ne fonctionne pas, utilisez des accolades. Ceci produira une erreur d'analyse.
echo "A banana is $fruits['banana'].";
// Fonctionne
echo "A banana is " . $fruits['banana'] . ".";
// Fonctionne
echo "This square is $square->width meters broad.";
// Ne fonctionne pas. Pour une solution, reportez-vous � la syntaxe complexe.
echo "This square is $square->width00 centimeters broad.";
?>
Pour tout ce qui est encore plus complexe, vous devriez utiliser la syntaxe complexe.
Syntaxe complexe
Cette syntaxe est appel�e complexe, non pas par qu'elle est complexe, mais parce qu'elle permet l'utilisation d'expressions complexes.
En fait, n'importe quelle valeur d'un espace de nom peut �tre inclue dans une cha�ne de caract�res avec cette syntaxe. �crivez simple l'expression de la m�me fa�on qu'elle devrait l'�tre � l'ext�rieur de la cha�ne et ensuite, entourez-l� des caract�res { et }. Sachant que le caract�re { ne peut pas �tre �chapp�, cette syntaxe ne sera reconnue que lorsque le caract�re $ suit imm�diatement le caract�re {. Utilisez {\$ pour afficher litt�ralement {$. Quelques exemples pour �tre clair :
<?php
// Montre toutes les erreurs
error_reporting(E_ALL);
$great = 'fantastic';
// Ne fonctionne pas, affiche : This is { fantastic}
echo "This is { $great}";
// Fonctionne, affiche : This is fantastic
echo "This is {$great}";
echo "This is ${great}";
// Fonctionne
echo "This square is {$square->width}00 centimeters broad.";
// Fonctionne
echo "This works: {$arr[4][3]}";
// Ceci est faux pour la m�me raison pour laquelle $foo[bar] est faux � l'ext�rieur d'une cha�ne.
// En d'autres termes, ceci fonctionnera, mais uniquement parceque PHP cherchera d'abord
// une constante nomm�e foo ; une erreur de niveau E_NOTICE (constante ind�finie) sera �mise.
echo "This is wrong: {$arr[foo][3]}";
// Fonctionne. Lors de l'utilisation de tableaux multidimensionnels, utilisez toujours
// les accolades autour du tableaux lorsqu'il se trouve dans la cha�ne
echo "This works: {$arr['foo'][3]}";
// Fonctionne.
echo "This works: " . $arr['foo'][3];
echo "This works too: {$obj->values[3]->name}";
echo "This is the value of the var named $name: {${$name}}";
echo "This is the value of the var named by the return value of getName(): {${getName()}}";
echo "This is the value of the var named by the return value of \$object->getName(): {${$object->getName()}}";
?>
Note: Les appels de fonctions et de m�thodes dans {$} fonctionnent depuis PHP 5.
Acc�s et modification d'une cha�ne, par caract�re
On peut acc�der et modifier les caract�res d'une cha�ne de caract�res en sp�cifiant sa position (� partir de 0) en utilisant la m�me syntaxe que pour les tableaux, comme pour la variable $str[42]. Il convient de voir une cha�ne de caract�res comme un tableau dans ce cas.
Note: On peut �galement acc�der � une cha�ne en utilisant des accolades, comme ceci : $str{42}. Cependant, cette syntaxe est obsol�te depuis PHP 6. Utilisez les crochets � la place.
�crire � une position hors de l'intervalle de l'existant fait que la cha�ne est compl�t�e par des espaces jusqu'� cette position. Les positions sont toujours converties en valeur enti�re. Les positions invalides produisent une alerte E_NOTICE. Les positions n�gatives produisent une alerte E_NOTICE en �criture, mais lisent une cha�ne vide. Seul le premier caract�re d'une cha�ne assign�e est utilis�e. Assigner une cha�ne vide assigne le caract�re NUL.
Exemple #8 Quelques exemples de cha�nes
<?php
// R�cup�ration du premier caract�re d'une cha�ne
$str = 'This is a test.';
$first = $str[0];
// R�cup�ration du troisi�me caract�re d'une cha�ne
$third = $str[2];
// R�cup�ration du dernier caract�re d'une cha�ne
$str = 'This is still a test.';
$last = $str[strlen($str)-1];
// Modification du dernier caract�re d'une cha�ne
$str = 'Look at the sea';
$str[strlen($str)-1] = 'e';
?>
Note: L'acc�s aux autres types de variables en utilisant [] ou {} retournera silencieusement NULL.
Fonctions et op�rateurs utiles
Une cha�ne de caract�res peut �tre concat�n�e en utilisant l'op�rateur '.' (point). Notez que l'op�rateur '+' (addition) ne fonctionnera pas. Reportez-vous aux op�rateurs de cha�ne pour plus d'informations.
Il y a beaucoup de fonctions utiles pour la manipulation de cha�ne de caract�res.
Reportez-vous � la section sur les fonctions des cha�nes de caract�res pour plus de pr�cisions et � la section sur les expressions rationnelles ou sur les expressions rationnelles compatibles Perl pour des recherches et des remplacements avanc�s.
Il y a �galement des fonctions pour les URL, et des fonctions pour chiffrer, d�chiffrer les cha�nes de caract�res (mcrypt et mhash).
Et pour finir, reportez-vous aux fonctions "type de caract�res".
Conversion en cha�ne de caract�res
Une valeur peut �tre convertie en une cha�ne de caract�res, en utilisant le mot cl� (string) ou la fonction strval(). La conversion d'une cha�ne de caract�res est automatiquement effectu�e dans le contexte d'une expression o� une cha�ne de caract�res est n�cessaire. Ceci survient lors de l'utilisation des fonctions echo() ou print() ou lorsqu'une variable est compar�e � une cha�ne. Les sections sur les types et sur le transtypage expliquent ce qui suit de mani�re plus d�taill�es. Reportez-vous �galement � la fonction settype().
La valeur bool�enne TRUE est convertie en la cha�ne "1". La valeur bool�enne FALSE est convertie en "" (une cha�ne vide). Ceci permet les conversions vers et depuis une cha�ne et un bool�en.
Un entier ou un nombre d�cimal est converti en une cha�ne de caract�res repr�sentant le nombre de fa�on textuel (incluant la partie exponentielle pour les nombres � virgule flottante). Les nombres � virgule flottante peuvent �tre convertis en utilisant la notation exponentielle (4.1E+6).
Note: Le point d�cimal est d�finit dans la locale du script (cat�gorie LC_NUMERIC). Reportez-vous � la fonction setlocale().
Les tableaux sont toujours convertis en la cha�ne "Array" ; ainsi, echo() et print() ne peuvent �tre utilis�s pour afficher le contenu d'un tableau. Pour afficher un seul �l�ment, utilisez un constructeur comme echo $arr['foo']. Voir ci-dessous pour des astuces permettant d'afficher le contenu complet.
Les objets en PHP 4 sont toujours convertis en la cha�ne "Object". Pour afficher les valeurs des membres de l'objet (aux fins de d�boguage, par exemple), lisez le paragraphes ci-dessous. Pour r�cup�rer le nom de la classe de l'objet, utilisez la fonction get_class(). Depuis PHP 5, la m�thode __toString est utilis�e lorsqu'elle peut s'appliquer.
Les ressources sont toujours converties en la cha�ne "Resource id #1", o� 1 est le nombre unique assign� � la ressource par PHP au moment de l'ex�cution. Ne vous fiez pas � cette structure, il est possible qu'elle change. Pour r�cup�rer le type de la ressource, utilisez la fonction get_resource_type().
NULL est toujours converti en une cha�ne vide.
Au vue de tout cela, la conversion d'un tableau, d'un objet ou d'une ressource en une cha�ne de caract�res ne fournit aucune information utile sur la valeur contenue dans ce type. Reportez-vous aux fonctions print_r() et var_dump() pour plus d'informations sur le contenu de ces types.
La plupart des valeurs en PHP peuvent �galement �tre convertie en cha�ne de caract�res afin de les stocker. Cette m�thode est appel�e "lin�arisation", et est effectu�e par la fonction serialize(). Si le moteur PHP a �t� compil� avec le support WDDX, les valeurs PHP peuvent �galement �tre lin�aris�es en XML.
Conversion de cha�nes en nombres
Lorsqu'une cha�ne de caract�res est �valu�e dans un contexte num�rique, la valeur et le type r�sultants sont d�termin�s comme suit.
Si la cha�ne de caract�res ne contient aucun '.', 'e', ou 'E' et que la valeur num�rique est dans l'intervalle de repr�sentation des entiers (et notamment plus petite que PHP_INT_MAX), alors la cha�ne de caract�res sera transform�e en entier. Dans les autres cas, elle sera interpr�t�e comme un nombre d�cimal.
La valeur est fournie par la portion initiale de la cha�ne de caract�res. Si la cha�ne de caract�res commence par un caract�re num�rique valide, ce sera la valeur utilis�e. Sinon, la valeur sera de 0 (z�ro). Une valeur num�rique valide est un signe optionnel, suivi par un ou plusieurs nombres (contenant, optionnellement, un point d�cimal), suivi par, �ventuellement, un exponentiel. L'exponentiel est un 'e' ou 'E' suivi par un ou plusieurs nombres.
<?php
$foo = 1 + "10.5"; // $foo est un nombre � virgule flottante (11.5)
$foo = 1 + "-1.3e3"; // $foo est un nombre � virgule flottante (-1299)
$foo = 1 + "bob-1.3e3"; // $foo est un entier (1)
$foo = 1 + "bob3"; // $foo est un entier (1)
$foo = 1 + "10 Small Pigs"; // $foo est un entier (11)
$foo = 4 + "10.2 Little Piggies"; // $foo est un nombre � virgule flottante (14.2)
$foo = "10.0 pigs " + 1; // $foo est un nombre � virgule flottante (11)
$foo = "10.0 pigs " + 1.0; // $foo est un nombre � virgule flottante (11)
?>
Pour plus d'informations sur ces conversions, reportez-vous au manuel Unix de la fonction strtod(3).
Pour tester un exemple de cette section, copiez/collez l'exemple et ins�rez la ligne suivante pour voir ce qu'il se passe :
<?php
echo "Le type de \$foo==$foo; est " . gettype ($foo) . "<br />\n";
?>
Ne vous attendez pas � r�cup�rer le code d'un caract�re en le convertissant en entier, comme cela est possible en C. Utilisez la fonction ord() et la fonction chr() pour convertir les caract�res en codes ASCII.