Avantages et inconvénients de la syntaxe heredoc

Eléphant du PHP | 256 Messages

17 nov. 2010, 20:49

Bonjour,

Bah, j'ai une question théorique, car j'adore couper en quatre les cheveux.

Quels sont les avantages et les inconvénients de la syntaxe heredoc ? Pourquoi est-elle si peu employée ?

En fait, selon moi, elle présente l'atout de ne pas obliger à jongler entre guillemets simples et doubles pour l'affichage des variables, en dépit de sa contrainte de retour à la ligne.

Les débutants qui me liront auront peut-être intérêt à s'y intéresser.

J'ai lu ça ou là que le Parsing du code était un chouïa plus lent, mais peut-être s'agit-il d'une légende.

Qu'en pensez-vous ?

Cordialement,

Gaspard

ViPHP
AB
ViPHP | 5818 Messages

17 nov. 2010, 22:51

Oui t'as bien résumé les choses. Et si le parsing est un poil mois rapide, ce ne doit pas être de beaucoup. Pourquoi ne fais tu pas un petit bench pour mieux cerner la différence ?

Eléphant du PHP | 256 Messages

17 nov. 2010, 23:36

Bonsoir,

Merci, Ab !

Un Bench. Je ne savais pas comment faire ! Mais j'ai trouvé sur developpez.com.

Donc, avec trois millions d'itérations...
$chaine='Ceci est une chaîne.'; // 1.0373899936676 seconde
$chaine="Ceci est une chaîne."; // 0.957768201828 seconde
<<<EOD
Ceci est une chaîne.
EOD; 
// 1.0345089435577 seconde
Donc, si je m'y suis bien pris, la différence n'est pas énorme. :mrgreen:

Cordialement,

Gaspard

ViPHP
AB
ViPHP | 5818 Messages

18 nov. 2010, 04:00

Tu ne t'y ai pas tout à fait bien pris.

D'une part il faudrait une chaine plus longue et puis surtout avec des concaténations de texte et de variables pour représenter un peu mieux la réalité. Genre :
$var1 = 'ma première variable';
$var2 = 'ma seconde variable';
$var3 = 'ma troisième variable';

//Et tu bench par exemple sur

$chaine = '<div><p>du texte et encore du texte '.$var1.' <a href ="'.$var2.'" >'.$var1.'</a> et puis du texte et encore du texte '.$var1.' </p></div>';

//et l'équivalent avec heredoc
Bon c'est un exemple juste pour dire qu'il vaut mieux tester sur des trucs qui ressemblent un peu plus à la réalité. Là ton exemple était un peu trop minimaliste et non représentatif :wink:

Eléphant du PHP | 256 Messages

18 nov. 2010, 10:30

Bonjour,

Oui, Ab, j'ai suivi ta remarque. Les résultats des tests sont plus intéressants...
$var1 = 'lundi';
$var2 = 'mardi';
$var3 = 'jeudi';
... $chaine = '<div><p>du texte et encore du texte '.$var1.' <a href ="'.$var2.'" >'.$var2.'</a> et puis du texte et encore du texte '.$var3.' </p></div>';
// 4.1067469120026 secondes
$chaine = "<div><p>du texte et encore du texte ".$var1." <a href =".$var2." >".$var2."</a> et puis du texte et encore du texte ".$var3." </p></div>";
// 4.1809959411621 secondes
$chaine = <<<EOD
<div><p>du texte et encore du texte $var1 <a href = $var2>$var2</a> et puis du texte et encore du texte $var3.</p></div>
EOD;
// 4.3892140388489 secondes
Donc, j'ai l'impression que, sur trois millions d'itérations, la différence n'est pas si importante...

Néanmoins, une remarque et une question...
- le résultat des traitements fluctue d'un moment à l'autre, mais la différence est conservée ;
- y-a-t-il un effet "mémoire" du Parseur, qui mettrait plus de temps à effectuer la première itération que les suivantes (je pourrai tester avec deux itérations, mais je ne suis pas certain que le temps soit mesurable) ?

Edit...
Pour 1, 2, 3, 4 itérations avec la syntaxe heredoc, j'obtiens :
  • 2.0980834960938E-5 seconde
    2.5033950805664E-5 seconde
    2.9087066650391E-5 seconde
    3.0994415283203E-5 seconde
Autrement dit, la différence est quasiment la même itération par itération. Il y a juste un temps de latence au début du traitement, qui est incompressible.

Merci.

Cordialement,

Gaspard

ViPHP
ViPHP | 5462 Messages

18 nov. 2010, 11:09

y'a une nouvelle syntax aussi dans php 5.3 c'est newdoc, elle permet de ne pas interprété le contenu comme les quote par rapport au double quote d'une chaine
$test = 'toto';
	
$text = <<<HEREDOC
	hello $test
HEREDOC;

echo $text;
//hello toto
$test = 'toto';
$text = <<<'NEWDOC'
	hello $test
NEWDOC;

echo $text;
//hello $test
on peux aussi mettre les double quote sur cette syntaxe
$test = 'toto';
	
$text = <<<"HEREDOC"
	hello $test
HEREDOC;
echo $text;
//hello toto
:wink:

Eléphant du PHP | 256 Messages

18 nov. 2010, 11:54

Bonjour Stealth,

Jusqu'à te lire, je n'avais pas compris la différence entre heredoc et herenow. :wink:

Thanks.

Gaspard

ViPHP
AB
ViPHP | 5818 Messages

18 nov. 2010, 13:50

Le second test est quand même plus significatif car quand on met une chaine de caractères entre simples quotes le parseur ne cherche pas à l'interpréter, et cela va normalement un peu plus vite que de mettre cette même chaine entre doubles quotes où le parseur doit définir s'il s'agit d'une variable ou d'une chaine de caractères.
Or dans ton premier test on observait une différence au profit de la syntaxe entre doubles quotes, comme quoi il est important de faire des tests significatifs :wink: