Entre guillemets simples
La manière la plus simple de spécifier une chaîne est de l'encadrer de guillemets
simples (le caractère '
).
Pour spécifier un guillemet simple littéral, échappez-le avec un antislash
(\
). Pour spécifier un antislash littéral, doublez-le
(\\
). Toutes les autres occurrences de l'antislash seront traitées
comme un antislash littéral : cela signifie que les autres séquences d'échappement que vous
pourriez connaître, telles que \r
ou \n
,
seront sorties littéralement comme spécifié plutôt que d'avoir une signification spéciale.
Note:
Contrairement aux guillemets doubles
et syntaxes heredoc,
les variables et les séquences d'échappement
pour les caractères spéciaux ne seront pas étendues
lorsqu'elles se trouvent dans des chaînes entre guillemets simples.
Heredoc
Une troisième manière de délimiter les chaînes 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 à nouveau pour fermer la citation.
L'identifiant de fermeture peut être indenté par des espaces ou des tabulations, auquel cas
l'indentation sera supprimée de toutes les lignes dans la chaîne doc.
Avant PHP 7.3.0, l'identifiant de fermeture doit
commencer dans la première colonne de la ligne.
De plus, l'identifiant de fermeture doit suivre les mêmes règles de nommage que tout
autre label en PHP : il doit contenir uniquement des caractères alphanumériques et
des soulignés, et doit commencer par un caractère non numérique ou un souligné.
Exemple #1 Exemple de base de Heredoc à partir de PHP 7.3.0
<?php
// pas d'indentation
echo <<<END
a
b
c
\n
END;
// 4 espaces d'indentation
echo <<<END
a
b
c
END;
Résultat de l'exemple ci-dessus en PHP 7.3 :
Si l'identifiant de fermeture est indenté plus que n'importe quelle ligne du corps, alors une ParseError sera levée :
Exemple #2 L'identifiant de fermeture ne doit pas être indenté plus que n'importe quelle ligne du corps
<?php
echo <<<END
a
b
c
END;
Résultat de l'exemple ci-dessus en PHP 7.3 :
PHP Parse error: Niveau d'indentation du corps invalide (attend un niveau d'indentation d'au moins 3) dans example.php à la ligne 4
Si l'identifiant de fermeture est indenté, des tabulations peuvent également être utilisées, cependant,
les tabulations et les espaces ne doivent pas être mélangés concernant
l'indentation de l'identifiant de fermeture et l'indentation du corps
(jusqu'à l'identifiant de fermeture). Dans l'un de ces cas, une ParseError sera levée.
Ces contraintes d'espace ont été incluses car le mélange d'espaces et de tabulations pour l'indentation nuit à la lisibilité.
Exemple #3 Indentation différente pour le corps (espaces) identifiant de fermeture
<?php
// Tout le code suivant ne fonctionne pas.
// indentation différente pour le corps (espaces) marqueur de fin (tabulations)
{
echo <<<END
a
END;
}
// mélange d'espaces et de tabulations dans le corps
{
echo <<<END
a
END;
}
// mélange d'espaces et de tabulations dans le marqueur de fin
{
echo <<<END
a
END;
}
Résultat de l'exemple ci-dessus en PHP 7.3 :
Erreur d'analyse PHP : indentation invalide - les onglets et les espaces ne peuvent pas être mélangés dans example.php ligne 8
L'identifiant de fermeture pour la chaîne du corps n'est pas requis pour être
suivi d'un point-virgule ou d'un saut de ligne. Par exemple, le code suivant
est autorisé à partir de PHP 7.3.0 :
Exemple #4 Continuation d'une expression après un identifiant de fermeture
<?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 fermeture a été trouvé au début d'une ligne, alors
peu importe s'il faisait partie d'un autre mot, il peut être considéré
comme l'identifiant de fermeture et provoquer une ParseError.
Exemple #5 L'identifiant de fermeture dans le corps de la chaîne tend à provoquer une ParseError
<?php
$values = [<<<END
a
b
END ING
END, 'd e f'];
Résultat de l'exemple ci-dessus en PHP 7.3 :
Erreur d'analyse PHP : erreur de syntaxe, identifiant inattendu "ING", attente de "]" dans example.php à la ligne 6
Pour éviter ce problème, il est sûr de suivre la règle simple :
ne pas choisir comme identifiant de fermeture s'il apparaît dans le corps
du texte.
Avertissement
Avant PHP 7.3.0, il est très important de noter que la ligne contenant l'
identifiant de fermeture ne doit contenir aucun autre caractère, sauf un point-virgule
(;
).
Cela signifie surtout que l'identifiant
ne peut pas être indenté, et il ne doit pas y avoir d'espaces
ou d'onglets avant ou après le point-virgule. Il est également important de réaliser que
le premier caractère avant l'identifiant de fermeture doit être un saut de ligne tel
que défini par le système d'exploitation local. C'est \n
sur
les systèmes UNIX, y compris macOS. Le délimiteur de fermeture doit également être
suivi d'un saut de ligne.
Si cette règle est enfreinte et que l'identifiant de fermeture n'est pas "propre", il ne sera
pas considéré comme un identifiant de fermeture, et PHP continuera à en chercher un. Si un
identifiant de fermeture approprié n'est pas trouvé avant la fin du fichier
courant, une erreur d'analyse se produira à la dernière ligne.
Exemple #6 Exemple invalide, avant 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 avant PHP 7.3.0
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
?>
Les heredocs contenant des variables ne peuvent pas être utilisés pour initialiser des propriétés de classe.
Le texte heredoc se comporte exactement comme une string entre guillemets doubles, sans les guillemets. Cela signifie que les guillemets dans un heredoc n'ont pas besoin d'être échappés, mais les codes d'échappement mentionnés ci-dessus peuvent toujours être utilisés. Les variables sont développées, mais il faut prendre le même soin lors de l'expression de variables complexes à l'intérieur d'un heredoc que pour les strings.
Exemple #8 Exemple de citation de chaîne heredoc
<?php
$str = <<<EOD
Exemple de chaîne
s'étendant sur plusieurs lignes
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". Je suis en train d'imprimer $foo->foo.
Maintenant, j'imprime {$foo->bar[1]}.
Cela devrait imprimer un 'A' majuscule : \x41
EOT;
?>
L'exemple ci-dessus va afficher :
Mon nom est "MyName". Je suis en train d'imprimer Foo.
Maintenant, j'imprime Bar2.
Cela devrait imprimer un 'A' majuscule : A
Il est également possible d'utiliser la syntaxe heredoc pour passer des données aux arguments de fonction :
Exemple #9 Heredoc dans les exemples d'arguments
<?php
var_dump(array(<<<EOD
foobar!
EOD
));
?>
Il est possible d'initialiser des variables statiques et des propriétés/constants de classe en utilisant la syntaxe heredoc :
Exemple #10 Utilisation d'Heredoc pour initialiser des valeurs statiques
<?php
// Variables statiques
function foo()
{
static $bar = <<<LABEL
Rien ici...
LABEL;
}
// Propriétés/constants de classe
class foo
{
const BAR = <<<FOOBAR
Exemple de constante
FOOBAR;
public $baz = <<<FOOBAR
Exemple de propriété
FOOBAR;
}
?>
L'identifiant d'ouverture du Heredoc peut éventuellement être
encadré de guillemets doubles :
Exemple #11 Utilisation de guillemets doubles dans le Heredoc
<?php
echo <<<"FOOBAR"
Bonjour le monde !
FOOBAR;
?>
Nowdoc
Les nowdocs sont aux chaînes entre guillemets simples ce que les heredocs sont aux chaînes entre guillemets doubles. Un nowdoc est spécifié de manière similaire à un heredoc, mais aucune interpolation de chaîne n'est effectuée à l'intérieur d'un nowdoc. La construction est idéale pour intégrer du code PHP ou d'autres blocs de texte volumineux sans avoir besoin d'échapper. Il partage certaines caractéristiques avec la construction SGML
<![CDATA[ ]]>
, en ce sens qu'elle déclare un
bloc de texte qui n'est pas destiné à être analysé.
Un nowdoc est identifié par la même séquence <<<
utilisée pour les heredocs, mais l'identifiant qui suit est encadré de guillemets simples, par exemple <<<'EOT'
. Toutes les règles pour les identifiants heredoc s'appliquent également aux identifiants nowdoc, en particulier celles concernant l'apparence de l'identifiant de fermeture.
Exemple #12 Exemple de citation de chaîne nowdoc
<?php
echo <<<'EOD'
Exemple de chaîne s'étendant sur plusieurs lignes
utilisant la syntaxe nowdoc. Les barres obliques inverses sont toujours traitées littéralement,
c'est-à-dire \\ et \'.
EOD;
L'exemple ci-dessus va afficher :
Exemple de chaîne s'étendant sur plusieurs lignes
utilisant la syntaxe nowdoc. Les barres obliques inverses sont toujours traitées littéralement,
c'est-à-dire \\ et \'.
Exemple #13 Exemple de citation 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'
Mon nom est "$name". Je suis en train d'imprimer $foo->foo.
Maintenant, j'imprime {$foo->bar[1]}.
Cela ne devrait pas imprimer un 'A' majuscule : \x41
EOT;
?>
L'exemple ci-dessus va afficher :
Mon nom est "$name". Je suis en train d'imprimer $foo->foo.
Maintenant, j'imprime {$foo->bar[1]}.
Cela ne devrait pas imprimer un 'A' majuscule : \x41
Exemple #14 Exemple de données statiques
<?php
class foo {
public $bar = <<<'EOT'
bar
EOT;
}
?>
Interpolation de chaînes
Lorsqu'une chaîne est spécifiée entre guillemets doubles ou avec heredoc,
des variables peuvent être substituées à l'intérieur.
Il existe deux types de syntaxe : une
de base et une
avancée.
La syntaxe de base est la plus courante et la plus pratique. Elle offre un moyen d'incorporer une variable, une valeur tableau ou une propriété objet dans une chaîne avec un minimum d'effort.
Syntaxe de base
Si un signe dollar ($
) est rencontré, les caractères qui le suivent et qui peuvent être utilisés dans un nom de variable seront interprétés comme tels et substitués.
Formuellement, la structure pour la syntaxe de substitution de variable de base est la suivante :
Avertissement
La syntaxe ${ expression }
est dépréciée depuis
PHP 8.2.0, car elle peut être interprétée comme
des variables de variables :
La syntaxe d'interpolation de chaîne
avancée devrait être utilisée à la place.
Note:
S'il n'est pas possible de former un nom valide, le signe dollar reste
tel quel dans la chaîne :
Exemple #15 Interpolation de la valeur de la première dimension d'un tableau ou d'une propriété
<?php
$juices = array("pomme", "orange", "string_key" => "violet");
echo "Il a bu un peu de $juices[0] jus.";
echo PHP_EOL;
echo "Il a bu un peu de $juices[1] jus.";
echo PHP_EOL;
echo "Il a bu un peu de $juices[string_key] jus.";
echo PHP_EOL;
class A {
public $s = "chaîne";
}
$o = new A();
echo "Valeur de l'objet : $o->s.";
?>
L'exemple ci-dessus va afficher :
Il a bu un peu de pomme jus.
Il a bu un peu de orange jus.
Il a bu un peu de violet jus.
Valeur de l'objet : chaîne.
Note:
La clé du tableau doit être non citée, et il n'est donc pas possible de
référencer une constante comme clé avec la syntaxe de base. Utilisez la
syntaxe avancée
à la place.
Depuis PHP 7.1.0, les indices numériques négatifs sont également
supportés.
Exemple #16 Indices numériques négatifs
<?php
$string = 'chaîne';
echo "Le caractère à l'indice -2 est $string[-2].", PHP_EOL;
$string[-3] = 'o';
echo "Changer le caractère à l'indice -3 en o donne $string.", PHP_EOL;
?>
L'exemple ci-dessus va afficher :
Le caractère à l'indice -2 est n.
Changer le caractère à l'indice -3 en o donne strong.
Pour tout ce qui est plus complexe, la
syntax avancée
doit être utilisée.
Syntaxe avancée (syntax de accolades)
La syntaxe avancée permet l'interpolation de
variables avec des accesseurs arbitraires.
Toute variable scalaire, élément de tableau ou propriété d'objet
(statique ou non) avec une représentation
chaîne peut être incluse via cette syntaxe.
L'expression est écrite de la même manière que celle qui apparaîtrait en dehors de la
chaîne, puis entourée de {
et
}
. Étant donné que {
ne peut pas être échappé, cette
syntaxe ne sera reconnue que lorsque le $
suit immédiatement le
{
. Utilisez {\$
pour obtenir un
{$
. Voici quelques exemples pour clarifier :
Note:
Comme cette syntaxe permet des expressions arbitraires, il est possible d'utiliser
des variables variables
dans la syntaxe avancée.
Accès et modification de chaîne par caractère
Les caractères dans les chaînes peuvent être accédés et modifiés en
spécifiant l'offset basé sur zéro du caractère souhaité après la
chaîne à l'aide de crochets array, comme dans
$str[42]. Pensez à une chaîne comme à un
tableau de caractères à cette fin. Les fonctions
substr() et substr_replace()
peuvent être utilisées lorsque vous souhaitez extraire ou remplacer plus d'un caractère.
Note:
Depuis PHP 7.1.0, les offsets de chaîne négatifs sont également supportés. Ceux-ci spécifient
l'offset à partir de la fin de la chaîne.
Auparavant, les offsets négatifs émettaient E_NOTICE
pour la lecture
(produisant une chaîne vide) et E_WARNING
pour l'écriture
(laissant la chaîne intacte).
Note:
Avant PHP 8.0.0, les chaînes pouvaient également être accédées en utilisant des accolades, comme dans
$str{42}, pour le même objectif.
Cette syntaxe de accolades a été dépréciée depuis PHP 7.4.0 et n'est plus prise en charge depuis PHP 8.0.0.
Avertissement
Écrire à un offset hors de portée remplit la chaîne d'espaces.
Les types non entiers sont convertis en entier.
Un type d'offset illégal émet E_WARNING
.
Seul le premier caractère d'une chaîne assignée est utilisé.
Depuis PHP 7.1.0, assigner une chaîne vide génère une erreur fatale. Auparavant,
cela assignait un octet NULL.
Avertissement
En interne, les chaînes PHP sont des tableaux d'octets. En conséquence, accéder ou
modifier une chaîne à l'aide de crochets de tableau n'est pas sûr pour les multi-octets, et
ne devrait être fait qu'avec des chaînes en encodage à un seul octet tel que ISO-8859-1.
Note:
Depuis PHP 7.1.0, appliquer l'opérateur d'index vide sur une chaîne vide génère une erreur fatale.
Auparavant, la chaîne vide était silencieusement convertie en tableau.
Exemple #17 Quelques exemples de chaînes
<?php
// Obtenez le premier caractère d'une chaîne
$str = 'Ceci est un test.';
$first = $str[0];
// Obtenez le troisième caractère d'une chaîne
$third = $str[2];
// Obtenez le dernier caractère d'une chaîne.
$str = 'Ceci est toujours un test.';
$last = $str[strlen($str)-1];
// Modifiez le dernier caractère d'une chaîne
$str = 'Regardez la mer';
$str[strlen($str)-1] = 'e';
?>
Les offsets de chaîne doivent être des entiers ou des chaînes ressemblant à des entiers,
sinon un avertissement sera émis.
Exemple #18 Exemple d'offsets de chaîne illégaux
<?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 (à l'exception des tableaux ou objets
implémentant les interfaces appropriées) en utilisant []
ou
{}
renvoie silencieusement null
.
Note:
Les caractères dans les littéraux de chaîne peuvent être accédés
en utilisant []
ou {}
.
Note:
Accéder à des caractères dans des littéraux de chaîne en utilisant la
syntaxe {}
a été déprécié dans PHP 7.4.
Cela a été supprimé dans PHP 8.0.