Guillemets simples
La façon la plus simple de spécifier une chaîne de caractères est de l'entourer de guillemets
simples (le caractère '
).
Pour spécifier un guillemet simple littéral, il doit être échappé à l'aide
d'un antislash (\
). Pour spécifier un antislash littéral,
doublez-le (\\
).
Toute les autres instances d'antislash seront traitées comme un antislash
littéral : ce qui signifie que les autres séquences auquelles vous
êtes éventuellement habitués (comme \r
ou \n
)
s'afficheront telles quelles, sans avoir une quelconque signification particulière.
Note:
Contrairement aux syntaxes avec
double guillemets
et heredoc, les
variables
et les séquences d'échappement
pour les caractères spéciaux ne seront pas interprétées lorsqu'elles
figurent dans une chaîne de caractères entourée de guillemets simples.
Syntaxe Heredoc
Une troisiè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, suivi d'une nouvelle ligne. La chaîne de caractères en elle-même vient ensuite,
suivie du même identifiant pour fermer la notation.
L'identifiant de fin peut être indenté par des espaces ou tabulations,
au quel cas l'indentation sera retirée de toutes les lignes dans la
chaîne de caractères doc.
Antérieur à PHP 7.3.0, l'identifiant de fin
doit
commencer à la première colonne de la ligne.
De plus, l'identifiant doit suivre les mêmes règles que n'importe quel
autre 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"
).
Exemple #1 Exemple Heredoc basique à partir de PHP 7.3.0
<?php
// no indentation
echo <<<END
a
b
c
\n
END;
// 4 spaces of indentation
echo <<<END
a
b
c
END;
Résultat de l'exemple ci-dessus en PHP 7.3 :
Si l'identifiant de fin est indenté plus que n'importe quelle ligne du texte,
alors une ParseError sera lancée :
Exemple #2 Closing identifier must not be indented further than any lines of the body
<?php
echo <<<END
a
b
c
END;
Résultat de l'exemple ci-dessus en PHP 7.3 :
PHP Parse error: Invalid body indentation level (expecting an indentation level of at least 3) in example.php on line 4
Si l'identifiant de fin est indenté, alors les tabulations peuvent aussi
être utilisé, néanmoins, les tabulations et les espaces ne
doivent pas
être mélangé en ce qui concerne l'indentation de
l'identifiant et l'indentation du texte (jusqu'à l'identifiant de fin).
Dans quelconque de ces cas, une ParseError sera lancée.
Ces contraintes sur les caractères d'espacement blanc ont été incluse car
le mélange de tabulations et d'espaces pour l'indentation est nuisible à
la lisibilité.
Exemple #3 Indentation différente pour le texte (espace) et identifiant de fin
<?php
// All the following code do not work.
// different indentation for body (spaces) ending marker (tabs)
{
echo <<<END
a
END;
}
// mixing spaces and tabs in body
{
echo <<<END
a
END;
}
// mixing spaces and tabs in ending marker
{
echo <<<END
a
END;
}
Résultat de l'exemple ci-dessus en PHP 7.3 :
PHP Parse error: Invalid indentation - tabs and spaces cannot be mixed in example.php line 8
L'identifiant de fin du corps du texte n'est pas requis d'être suivi
d'une point virgule ou une nouvelle ligne. Par exemple, le code suivant
est autorisé à partir de PHP 7.3.0:
Exemple #4 Continuer une expression après un identifiant de fin
<?php
$values = [<<<END
a
b
c
END, 'd e f'];
var_dump($values);
Résultat de l'exemple ci-dessus en PHP 7.3 :
array(2) {
[0] =>
string(11) "a
b
c"
[1] =>
string(5) "d e f"
}
Avertissement
Si l'identifiant de fin a été trouvé au début d'une ligne, alors peut
importe s'il fait partie d'un autre mot, il peut être considéré comme
l'identifiant de fin et causer une ParseError.
Exemple #5 Identifiant de fin dans le corps de la chaîne de caractères tend à causer une ParseError
<?php
$values = [<<<END
a
b
END ING
END, 'd e f'];
Résultat de l'exemple ci-dessus en PHP 7.3 :
PHP Parse error: syntax error, unexpected identifier "ING", expecting "]" in example.php on line 6
Pour éviter ce problème, il suffit de suivre cette règle simple :
ne pas choisir comme identifiant de fin si ceci apparait dans le
corps du texte.
Avertissement
Antérieur à PHP 7.3.0, il est très important de noter que la ligne
contenant l'identifiant de fin ne doit contenir aucun autre caractère,
mis à part un point-virgule (;
).
Cela signifie en particulier que l'identifiant
ne doit pas être indenté, et qu'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 telle que définie par le système d'exploitation ; sur les
systèmes Unix, incluant macOS, il s'agit du caractère \n
.
Le délimiteur de fermeture 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.
Exemple #6 Exemple invalide, antérieur à PHP 7.3.0
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
// L'identifiant ne doit pas être indenté
?>
Exemple #7 Exemple valide, même antérieur à PHP 7.3.0
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
?>
Heredoc contenant des variables ne peuvent être utilisé pour initialiser
les propriétés d'une classe.
Heredoc se comporte exactement comme une chaîne de caractères guillemets doubles,
sans les guillemets doubles. Cela signifie que les guillemets dans une
syntaxe Heredoc n'ont pas besoin d'être échappés, mais que les codes d'échappement
listés plus haut peuvent toujours être utilisés. Les variables seront interprétées,
mais les mêmes précautions doivent être prises lorsque des variables complexes
sont exprimées dans une Heredoc comme avec chaîne de caractères.
Exemple #8 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 __construct()
{
$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' majuscule : \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 données en paramètre à une fonction :
Exemple #9 Exemple d'utilisation de Heredoc pour passer des arguments
<?php
var_dump(array(<<<EOD
foobar!
EOD
));
Il est possible d'initialiser les variables statiques et les propriétés
ou constantes de classes avec la syntaxe Heredoc :
Exemple #10 Utilisation de Heredoc pour initialiser des valeurs 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;
}
?>
L'identifiant ouvrant Heredoc peut éventuellement
être écrit entre guillemets doubles :
Exemple #11 Utilisation des guillemets doubles avec Heredoc
<?php
echo <<<"FOOBAR"
Hello World!
FOOBAR;
?>
Nowdoc
Nowdoc est aux chaînes guillemets simples ce qu'Heredoc est aux chaînes
guillemets doubles. Un Nowdoc est spécifié de manière similaire à un Heredoc,
mais aucune analyse n'est effectuée à l'intérieur d'une
Nowdoc. Cette syntaxe est idéale pour embarquer du code PHP ou d'autres
larges blocs de texte, sans avoir besoin d'échapper quoi que ce soit.
Elle partage quelques fonctionnalités avec la syntaxe 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 guillemets
simples, comme <<<'EOT'
. Toutes les règles concernant
les identifiants Heredoc s'appliquent également aux identifiants Nowdoc,
et, tout particulièrement, celles concernant la forme de l'identifiant de fin.
Exemple #12 Exemple de chaîne Nowdoc
<?php
echo <<<'EOD'
Exemple de chaîne sur plusieurs lignes en utilisant la syntaxe Nowdoc.
Les barre oblique inversée sont toujours traité de façon littérale,
par exemple \\ and \'.
EOD;
L'exemple ci-dessus va afficher :
Exemple de chaîne sur plusieurs lignes en utilisant la syntaxe Nowdoc.
Les barre oblique inversée sont toujours traité de façon littérale,
par exemple \\ and \'.
Exemple #13 Exemple de chaîne Nowdoc avec des variables
<?php
class foo
{
public $foo;
public $bar;
function __construct()
{
$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
Exemple #14 Exemple avec des données statiques
<?php
class foo {
public $bar = <<<'EOT'
bar
EOT;
}
?>
Analyse des variables
Lorsqu'une chaîne de caractères est spécifiée entre guillemets doubles ou en Heredoc,
les variables qu'elle contient sont interprétées.
Il existe 2 types de syntaxes : 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, une valeur de tableau, ou une
propriété d'objet dans une chaîne de caractères avec un minimum d'effort.
La syntaxe complexe se reconnaît à l'utilisation d'accolades autour de
l'expression.
Syntaxe simple
Si un signe dollar ($
) est rencontré, l'analyseur prendra
autant de caractères que possible pour former un nom de variable valide.
Entourer le nom de la variable avec des accolades, pour spécifier
explicitement la fin de celui-ci.
De la même façon, un index d'un tableau ou une propriété d'un objet
peut être analysé. Avec les indices de tableaux, le crochet fermant
(]
) marque la fin de l'index. Les mêmes règles sont
appliquées aux propriétés d'objets que pour les simples variables.
Exemple #15 Exemple de la syntaxe simple
<?php
$juices = array("pomme", "poire", "koolaid1" => "raisin");
echo "Il a bu du jus de $juices[0].".PHP_EOL;
echo "Il a bu du jus de $juices[1].".PHP_EOL;
echo "Il a bu du jus de $juices[koolaid1].".PHP_EOL;
class people {
public $john = "John Smith";
public $jane = "Jane Smith";
public $robert = "Robert Paulsen";
public $smith = "Smith";
}
$people = new people();
echo "$people->john a bu du jus de $juices[0].".PHP_EOL;
echo "$people->john a dit bonjour à $people->jane.".PHP_EOL;
echo "$people->john's wife greeted $people->robert.".PHP_EOL;
echo "$people->robert a dit bonjour aux $people->smiths."; // Ne fonctionne pas
?>
L'exemple ci-dessus va afficher :
Il a bu du jus de pomme.
Il a bu du jus de poire.
Il a bu du jus de raisin.
John Smith a bu du jus de pomme.
John Smith a dit bonjour à Jane Smith.
John Smith's wife greeted Robert Paulsen.
Robert Paulsen a dit bonjour aux .
À partir de PHP 7.1.0 les indices numériques
négatifs
sont aussi supportés.
Exemple #16 Indices numériques négatifs
<?php
$string = 'string';
echo "Le personnage à l'index -2 est $string[-2].", PHP_EOL;
$string[-3] = 'o';
echo "Change le caractère à l'index -3 par o donne $string.", PHP_EOL;
?>
L'exemple ci-dessus va afficher :
Le personnage à l'index -2 est n.
Change le caractère à l'index -3 par o donne strong.
Pour tout ce qui est plus complexe, vous devriez utiliser la
syntaxe complexe.
Syntaxe complexe
Cette syntaxe est appelée complexe, non pas parce qu'elle est complexe,
mais parce qu'elle permet l'utilisation d'expressions complexes.
Toute variable scalaire, élément de tableau ou attribut d'objet représentable
en tant que chaîne de caractères peut être utilisé avec cette syntaxe.
L'expression est écrite de la même façon qu'elle apparaitrait à l'extérieur
de la chaîne de caractères et est entouré des caractères
{
et }
. Sachant que {
ne peut pas être
échappé, cette syntaxe ne sera reconnue que lorsque le
$
suit immédiatement {
. Utiliser
{\$
pour afficher littéralement {$
.
Voici quelques exemples pour éclaircir ceci :
Il est également possible d'accéder aux propriétés de classes en utilisant
des variables contenues dans des chaînes, en utilisant cette syntaxe.
Note:
Les valeurs accédé via les fonctions, méthodes, variables statiques de classes,
ainsi que les constantes de classes à l'intérieur de
{$}
sont interprétée
comme le nom d'une variable dans le contexte où la chaîne est définie.
L'utilisation de simples accolades ({}
) ne fonctionnera
pas pour accéder à la valeur retournée par des fonctions, méthodes, ou
les valeurs de constantes et de variables statiques de classes.
Accès et modification d'une chaîne, par caractère
On peut accéder à, et modifier un, caractère d'une chaîne de caractères en spécifiant
sa position (à partir de 0) après la chaîne de caractères en utilisant les crochets de
tableau, tel que $str[42].
Il convient dans ce cas de voir une chaîne de caractères comme un tableau de caractères.
Les fonctions substr() et
substr_replace()
peuvent être utilisées lorsque vous voulez extraire ou remplacer plus d'un caractère.
Note:
À partir de PHP 7.1.0, les positions négatives dans les chaînes de
caractères sont aussi supportées. Cela spécifie la position en partant
de la fin de la chaîne de caractères.
Auparavant, les index négatif émettait E_NOTICE
pour
la lecture (donnant une chaîne vide) et E_WARNING
pour
l'écriture (laissant la chaîne inchangée).
Note:
Antérieur à PHP 8.0.0, les strings pouvait aussi être accédé
en utilisant les accolades, comme ceci $str{42}.
La syntaxe avec les accolades a été rendue obsolète en PHP 7.4.0 et n'est
plus supportée à partir de PHP 8.0.0.
Avertissement
Écrire à une position hors de l'intervalle 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 types de positions invalides émettent une E_WARNING
.
Seul le premier caractère d'une chaîne assignée est utilisé.
À partir de PHP 7.1.0, assigner une chaîne vide lève une erreur fatale.
Auparavant, cela affectait un octet NULL.
Avertissement
En interne, les chaînes PHP sont des tableaux d'octets. Ainsi, l'accès ou la
modification d'une chaîne en utilisant les crochets d'un tableau n'est pas
multioctets, et ne doit être utilisé qu'avec les chaînes dont l'encodage
est sur un seul octet, comme ISO-8859-1.
Note:
À partir de PHP 7.1.0, appliquer un index vide sur une chaîne vide lève
une erreur fatale.
Auparavant, la chaîne était silencieusement convertie en un tableau.
Exemple #17 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';
?>
Les positions d'une chaîne doivent être un entier,
ou des chaînes pouvant être converties en entier, sinon, une alerte
sera émise.
Exemple #18 Exemple de Positions de Chaîne Invalide
<?php
$str = 'abc';
var_dump($str['1']);
var_dump(isset($str['1']));
var_dump($str['1.0']);
var_dump(isset($str['1.0']));
var_dump($str['x']);
var_dump(isset($str['x']));
var_dump($str['1x']);
var_dump(isset($str['1x']));
?>
L'exemple ci-dessus va afficher :
string(1) "b"
bool(true)
Warning: Illegal string offset '1.0' in /tmp/t.php on line 7
string(1) "b"
bool(false)
Warning: Illegal string offset 'x' in /tmp/t.php on line 9
string(1) "a"
bool(false)
string(1) "b"
bool(false)
Note:
Accéder à des variables d'autres types (pas des tableaux
ni des objets implémentant les interfaces appropriées) en utilisant
[]
ou {}
retournera
silencieusement null
.
Note:
Les caractères dans une chaîne de caractères littérales peuvent être
accédé en utilisant la syntaxe
[]
ou {}
.
Note:
Accéder aux caractères dans une chaîne de caractères littérales en
utilisant la syntaxe {}
a été rendu obsolète en PHP 7.4.
Ceci a été supprimée en PHP 8.0.