2011-09-28 16 views
5

Qualcuno qui può esplorare le complessità dell'utilizzo di heredoc in PHP utilizzando frammenti di codice di esempio php? , in base a ciò che dice il manuale di seguito?PHP Heredoc String Rules

manuale php.net dice:

E 'molto importante notare che la linea con l'identificatore di chiusura non deve contenere altri personaggi, tranne forse un punto e virgola (;). Ciò significa in particolare che l'identificatore non può essere rientrato e non possono esserci spazi o tabulazioni prima o dopo il punto e virgola. È anche importante rendersi conto che il primo carattere prima dell'identificatore di chiusura deve essere una nuova riga come definito dal sistema operativo locale. Questo è \n su sistemi UNIX, incluso Mac OS X. Il delimitatore di chiusura (eventualmente seguito da un punto e virgola) deve essere seguito anche da una nuova riga.

Se questa regola è interrotta e l'identificatore di chiusura non è "pulito", non verrà considerato un identificatore di chiusura e PHP continuerà a cercarne uno. Se non viene trovato un identificatore di chiusura appropriato prima della fine del file corrente, verrà generato un errore di analisi sull'ultima riga.

Heredocs non può essere utilizzato per inizializzare le proprietà della classe. A partire da PHP 5.3, questa limitazione è valida solo per heredocs contenenti variabili.

ecco il link al manuale php: http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

+0

Cosa complessità vuoi dire? –

+0

Indentazione automatica della stringa heredoc che fa parte del metodo di classe. Alcuni IDE, come Zend Studio, ti consentono di selezionare il codice e di indentarlo automaticamente per te. Questo farà rientrare la stringa heredoc. È giusto? Ci hai provato? Non l'ho ancora fatto perché mi richiederà molto tempo. Sono solo un principiante PHP. Ma è una delle domande nella mia mente. – stackoverflowpro

risposta

8

Questo è un uso semplice:

$bar = "stackoverflowpro"; 
$foo = <<<HTML 
<p>Hello $bar</p> 
HTML; 
+0

Cosa succede se fa parte di un metodo di classe? Sarà necessario indentarlo per la leggibilità del codice. destra? Come formerai il codice di classe php che include il tuo codice sopra? – stackoverflowpro

+0

Questo codice può essere utilizzato sia all'interno di una semplice pagina php che all'interno di un metodo. Esempio di utilizzo in un metodo potrebbe essere quello di restituire la variabile $ pippo e quindi stamparla dove vuoi! – JellyBelly

+0

purtroppo il codice all'interno di un heredoc non può essere formattato! – JellyBelly

6
echo <<< _html 

... some html code here ... 

_html; 

Importante è che il tag di chiusura è esattamente la stessa, come definito dopo il " < < < "e che il tag di chiusura sia inserito senza rientro (nessuna tabulazione, completamente appiccicoso a sinistra) e chiuso da un"; ".

Nota: il "_" non è richiesto, ma lo uso per indicare meglio che è un heredoc che si sta chiudendo.

+0

Cosa succede se fa parte di un metodo di classe? Dovrai indentarlo per la leggibilità del codice? destra? – stackoverflowpro

+0

Scusa, non capisco cosa stai cercando di chiedere. – JNDPNT

+0

Quello che intendevo dire è: se il tuo codice sopra fa parte di una classe php e devi formattare il codice probabilmente hai bisogno di rientrare la riga del delimitatore finale. Questo infrangerà la regola? – stackoverflowpro

5

L'identificatore di heredoc di chiusura NON DEVE avere alcun carattere tra l'inizio della riga e l'identificatore, PU MAY avere un singolo ; IMMEDIATAMENTE dopo e NON DEVE avere altri caratteri dopo di esso. Se l'identificatore viene indentato, deve essere trattato come parte della stringa heredoc. L'unico carattere che può apparire prima della nuova riga è ;. Non è possibile includere spazi vuoti tra l'identificatore e lo ; o tra lo ; e il newline. Ciò significa che se si utilizza un heredoc all'interno di una chiamata di funzione, è necessario inserire un'interruzione di riga subito dopo l'identificatore di chiusura (ad esempio prima di qualsiasi , o ), ecc.).

In altre parole, l'unica cosa che può apparire sulla linea con l'identificatore di chiusura è l'identificatore stesso e eventualmente uno virgola (;) immediatamente dopo l'identificatore. Il prossimo charcarter (se non alla fine del file) DEVE essere un carattere newline valido per il sistema operativo su cui è in esecuzione PHP.

Questa è una stringa heredoc valida:

$text = <<<EOT 
Hello! 
EOT; 

Questa stringa heredoc non è stato chiuso e   EOT; è considerata parte della stringa:

$text = <<<EOT 
    Hello! 
    EOT; 

L'esempio precedente fisso:

$text = <<<EOT 
    Hello! 
EOT; 

Un heredoc all'interno di una chiamata di funzione (notare che ); deve apparire su una nuova linea di lavoro):

print(<<<EOT 
Hello! 
EOT 
); 

Lo stesso come sopra, con rientro molto strano (si noti che l'unica cosa sulla linea identificatore di chiusura è l'identificativo e una nuova riga). Hello! avrà cinque spazi prima nella stringa:

  print(<<<EOT 
    Hello! 
EOT 
        ); 
1

Ecco un tentativo di un esempio che copre ogni possibile utilizzo di entrambi heredoc e nowdoc:

<?Php 
if (isset($_GET['css'])) 
{ // SET THE CONTENT TYPE 
    header("Content-type: text/css"); 
    echo // ECHO THE CSS STRING USING HEREDOC 
    // AS YOU NOTICE HERE, WE INSERT THE GET DATA WITH "{}" TO MAKE IT EASIER TO DISTINGUISH THE VARIABLES 
<<<MYCSS 
button#{$_GET['css']} 
{  color:white; 
     background-color:black; 
     padding:10px; 
} 
MYCSS; 
    // IMMEDIATELY EXIT THE PHP SCRIPT TO SKIP THE REST OF THE CODE 
    exit(); 
} 
else if (isset($_GET['js'])) 
{ // SET THE CONTENT TYPE 
    header("Content-type: text/javascript"); 
    echo // ECHO THE JAVASCRIPT STRING USING HEREDOC 
    // AS YOU NOTICE HERE, WE INSERT THE GET DATA WITH "{}" TO MAKE IT EASIER TO DISTINGUISH THE VARIABLES 
<<<MYJS 
function doSomething(param) 
{ alert(param); 
} 
$(document).ready 
( function() 
    { $("button#{$_GET['js']}").click 
     ( function() 
      { doSomething('do me'); 
      } 
     ); 
    } 
); 
MYJS; 
    // IMMEDIATELY EXIT THE PHP SCRIPT TO SKIP THE REST OF THE CODE 
    exit(); 
} 

$myAjax = 'https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js'; 
$buttonID = md5(time().rand(111111,999999)); 
$myBottom = "\t".'\tlower body'; 
$doMe= "give head"; 
$head = <<<GIVEAHEAD 
<html> 
<head> 
    <title>An advanced use of heredoc and more</title> 
    <script type='text/javascript' src="$myAjax"></script> 
    <script type='text/javascript' src="{$_SERVER['PHP_SELF']}?js={$buttonID}"></script> 
    <link rel="stylesheet" href="{$_SERVER['PHP_SELF']}?css={$buttonID}" type='text/css'> 
</head> 
GIVEAHEAD; 

// HERE'S A VARIETY OF WAYS YOU CAN INSERT A HEREDOC INSIDE A FUNCTION 
echo iScream 
( $doMe, 
     $head 
,<<<SHOWMYBODY 

<body> 
SHOWMYBODY 
. 
<<<_TATSMAHBAREH 

    <button id='$buttonID'>touch me 
_TATSMAHBAREH 
// YOU CAN BASICALLY PUT YOUR '.' ANYWHERE BEFORE A HEREDOC, BUT NOT AFTER A HEREDOC 
.pushIt(). 
<<<"FINISHOFF" 

{$myBottom} 
\taye\n 
FINISHOFF 
// A NOW DOC IS THE EQUIVALENT OF SINGLE QUOTE STRINGS 
// IT DOES NOT RECOGNIZE VARIABLES OR \t AND \n 
,<<<'ThisIsANowDoc' 
    $ThisWillNotBeTreatedAsAVariable 
    \tnope 
</body> 
</html> 
ThisIsANowDoc 
// A HEREDOC OR A NOWDOC CAN BE FOLLOWED BY A SEMICOLON (;), BUT NOT WITH ANYTHING ELSE 
); 

// RETURNING A HEREDOC FROM A FUNCTION 
function pushIt() 
{ return <<<YOLO 
</button> 
YOLO; 
// ENDING A HEREDOC; YOU CANNOT PUT ANYTHING ELSE 
// AFTER THE SEMICOLON - NOT EVEN A WHITESPACE 
} 

function iScream($act,$insert,$here,$below) 
{ if($act == 'give head') 
    return "$insert$here$below"; 
} 
?>