Les Heredocs, une possibilité de PHP trop peu exploitée

Si vous avez des tutoriels à proposer c'est ici.

Modérateur: Mika56

Jeune Membre
Avatar de l’utilisateur
Messages: 169
Enregistré le: Mar Jan 01 2008 : 12:03
Localisation: Pauméville

Les Heredocs, une possibilité de PHP trop peu exploitée

Messagepar DeHix » Lun Avr 14 2008 : 19:19

Bonjour,
je vais ici vous parler d'une manière de faire des chaînes de caractères en PHP : Les Heredocs.
Les Heredocs, peuvent être très pratiques ! En effet, c'est un peu l'équivalent de la balise HTML <pre> à la sauce PHP.
Découvrons qu'en est-il.
Tout d'abord, comment le déclarer ?
Pour déclarer une chaîne de caractères avec Heredoc, vous devez utiliser trois signes "inférieur" suivis de caractères arbitraires. Par exemple :
Code: Tout sélectionner
<<<HEREDOC


A la place de HEREDOC, vous auriez très bien pu mettre KiKooLoL, ou bien encore EOD (comme utilisé dans php.net), ou tout autre texte !
Ensuite, vous devrez passer une ligne, et à partir de là, vous pourrez écrire.
Exemple :
Code: Tout sélectionner
<<<EOD
Salut,
je suis une chaîne de caractère.
Je suis déclarée avec Heredoc !


/!\ Je vous conseille fortement de ne pas indenter le contenu d'une chaîne de caractères Heredoc, l'indentation se verra lors de l'affichage de la chaîne !

Maintenant, informons notre chaîne que nous ne voulons plus écrire dedans. Pour cela, il faudra utiliser la chaîne arbitraire que vous aurez insérée après les trois signes "inférieur".
Exemple :
Code: Tout sélectionner
<<<EOD
Salut,
je suis une chaîne de caractère.
Je suis déclarée avec Heredoc !
EOD;


/!\ Cette dernière ligne NE DOIT PAS être indentée ! ainsi qu'aucun autre caractère ne doit s'y trouver, même après le point-virgule (;) ! /!\

Voyons voir si notre texte s'affiche correctement :
Code: Tout sélectionner
<?php
echo <<<EOD
Salut,
je suis une chaîne de caractère.
Je suis déclarée avec Heredoc !
EOD;
?>


Affichage :
Salut,
je suis une chaîne de caractère.
Je suis déclarée avec Heredoc !


Comme vous le remarquerez, je n'ai pas délimité ma chaîne de caractères par des apostrophes ('), ou des guillemets (") étant donné qu'elle est déjà délimitée entre "<<<EOD et EOD;" .

Vous pouvez également afficher vos variables, comme ceci :
Code: Tout sélectionner
<?php
$action = 'code';
$langage = 'PHP';
$str = <<<EOD
Je $action en $langage !
EOD;
echo $str;
?>


Par contre, la concaténation n'est pas possible ! vous devez mettre vos variables tels quels !
Ce qui vaut pour les variables vaut également pour les classes ou les fonctions, exemple :

Code: Tout sélectionner
<?php
class classe_de_test_heredoc
{
   function classe_de_test_heredoc()
   {
      $this->test_heredoc_1 = 'Test réussi !';
   }
   function fonction_de_test_heredoc()
   {
      $str = 'Test 2 réussi !';
      return $str;
   }
}
$class_test = new classe_de_test_heredoc();
echo <<<EOD
Testons la classe 1er essai : $class_test->test_heredoc_1 .
Testons la classe 2ème essai : {$class_test->fonction_de_test_heredoc()} .
EOD;
?>


(Je n'ai pas trouvé comment faire apparaître une fonction hors d'une classe dans les heredocs, donc si quelqu'un trouve, qu'il me fasse signe !)

Oui mais, vous ne voulez pas que $pas_variable soit une variable, pour cela, deux solutions :
    Soit vous échappez le signe dollar ($) avec un antislashe (\)
    Soit vous délimitez entre apostrophes (') votre chaîne arbitraire suivant les trois signes "inférieur" (<<<).

Reprenons notre code précédent, nous voulons afficher les variables telles quelles, puis seulement afficher le contenu des variables :
(antislashe (\))
Code: Tout sélectionner
<?php
class classe_de_test_heredoc
{
   function classe_de_test_heredoc()
   {
      $this->test_heredoc_1 = 'Test réussi !';
   }
   function fonction_de_test_heredoc()
   {
      $str = 'Test 2 réussi !';
      return $str;
   }
}
$class_test = new classe_de_test_heredoc();
echo <<<EOD
Testons la classe 1er essai : \$class_test->test_heredoc_1 .
Testons la classe 2ème essai : \{\$class_test->fonction_de_test_heredoc()} .
EOD;
echo <<<EOD
Testons la classe 1er essai : $class_test->test_heredoc_1 .
Testons la classe 2ème essai : {$class_test->fonction_de_test_heredoc()} .
EOD;
?>


Affichage :
Testons la classe 1er essai : $class_test->test_heredoc_1 .
Testons la classe 2ème essai : {$class_test->fonction_de_test_heredoc()} .
Testons la classe 1er essai : Test réussi ! .
Testons la classe 2ème essai : Test 2 réussi ! .


Pour les apostrophes, n'ayant réussi à le faire fonctionner chez moi, je reprends l'exemple de php.net :
Code: Tout sélectionner
<?php
$str = <<<'EOD'
Example of string
spanning multiple lines
using nowdoc syntax.
EOD;

/* More complex example, with 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'
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': x41
EOT;
?>


Je pense donc que les antislashes sont à privilégier...

Voilà, j'espère que ce tutoriel vous aura aidé à mieux comprendre le fonctionnement des Heredocs ;p

À bientôt !

Administrateur Niloo
Avatar de l’utilisateur
Messages: 8111
Enregistré le: Lun Oct 01 2007 : 20:12

Re: Les Heredocs, une possibilité de PHP trop peu exploitée

Messagepar Nicolas » Lun Avr 14 2008 : 19:28

Merci pour ce tutoriel fort intéressant, je ne connaissais pas cette possibilité.

Jeune Membre
Avatar de l’utilisateur
Messages: 169
Enregistré le: Mar Jan 01 2008 : 12:03
Localisation: Pauméville

Re: Les Heredocs, une possibilité de PHP trop peu exploitée

Messagepar DeHix » Lun Avr 14 2008 : 19:33

Je m'en suis tout particulièrement servi pour passer des lignes lorsque j'écris dans mon fichier, les \n n'ayant pas fonctionné.

Ancien modérateur
Messages: 837
Enregistré le: Lun Oct 01 2007 : 20:48
Localisation: Genève

Re: Les Heredocs, une possibilité de PHP trop peu exploitée

Messagepar niaxZ » Ven Avr 18 2008 : 15:11

joli tuto :bravo2:
niaxZ ne fait plus partie de notre équipe

Retourner vers Tutoriels

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité