2011-09-28 18 views
5

¿Puede alguien aquí explorar las complejidades de usar heredoc en PHP usando ejemplos de fragmentos de código php? según lo que dice el manual a continuación?PHP Heredoc String Rules

manual de php.net dice:

Es muy importante tener en cuenta que la línea con el identificador de cierre debe contener ningún otro carácter, excepto quizás por un punto y coma (;). Eso significa especialmente que el identificador no puede sangrarse, y puede que no haya espacios o pestañas antes o después del punto y coma. También es importante darse cuenta de que el primer carácter antes del identificador de cierre debe ser una línea nueva según lo define el sistema operativo local. Esto es \n en sistemas UNIX, incluido Mac OS X. El delimitador de cierre (posiblemente seguido de un punto y coma) también debe ir seguido de una nueva línea.

Si esta regla se rompe y el identificador de cierre no está "limpio", no se considerará un identificador de cierre, y PHP continuará buscando uno. Si no se encuentra un identificador de cierre adecuado antes del final del archivo actual, se producirá un error de análisis en la última línea.

Heredocs no se puede utilizar para inicializar propiedades de clase. Desde PHP 5.3, esta limitación es válida solo para heredocs que contienen variables.

Aquí está el enlace al manual de php: http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

+0

Qué complejidades qué se refiere? –

+0

Sangría automáticamente la cadena a heredoc que es parte del método de clase. Algunos IDE, como Zend Studio, le permiten seleccionar el código y automáticamente sangrarlo por usted. Eso sangrará la cadena heredoc. ¿Está bien? ¿Lo intentaste? Todavía no lo hice porque me tomará mucho tiempo. Solo soy un principiante de php. Pero es una de las preguntas en mi mente. – stackoverflowpro

Respuesta

8

este es un uso simple:

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

¿Qué pasa si es parte de un método de clase? Tendrá que aplicar sangría para la legibilidad del código. ¿derecho? ¿Cómo va a formatear el código de la clase php que incluye su código anterior? – stackoverflowpro

+0

Este código se puede usar tanto en una página php simple como dentro de un método. Un ejemplo de uso en un método podría ser devolver la variable $ foo y luego ¡imprimirla donde quieras! – JellyBelly

+0

¡lamentablemente no se puede formatear el código dentro de un heredoc! – JellyBelly

6
echo <<< _html 

... some html code here ... 

_html; 

importante es que la etiqueta de cierre es precisamente el mismo que se definió después de la " < < < "y que la etiqueta de cierre se coloca sin sangría (sin pestañas, completamente adhesiva a la izquierda) y se cierra con un"; ".

Nota: el "_" no es necesario, pero lo uso para indicar mejor que es un heredoc que se está cerrando.

+0

¿Qué pasa si es parte de un método de clase? Tendrá que sangrar eso para la legibilidad del código? ¿derecho? – stackoverflowpro

+0

Lo siento, no entiendo lo que intentas preguntar. – JNDPNT

+0

Lo que quise decir es: si su código anterior es parte de una clase php y necesita formatear el código, es probable que necesite aplicar sangría a la línea del delimitador final. ¿Romperá eso la regla? – stackoverflowpro

5

El identificador de cierre heredoc NO DEBE tener ningún carácter entre el comienzo de la línea y el identificador, PUEDE tener un solo ; INMEDIATAMENTE después y NO DEBE tener ningún otro carácter después de él. Si el identificador se sangra, debe tratarse como parte de la cadena heredoc. El único carácter que puede aparecer antes de la nueva línea es ;. Ni siquiera puede incluir espacios en blanco entre el identificador y el ; o entre el ; y la nueva línea. Esto significa que si utiliza un heredoc dentro de una llamada de función, debe insertar un salto de línea justo después del identificador de cierre (es decir, antes de cualquier , o , etc.).

En otras palabras, lo único que puede aparecer en la línea con el identificador de cierre es el identificador mismo y opcionalmente un punto y coma (;) inmediatamente después del identificador. El siguiente carácter (si no está al final de archivo) DEBE ser un carácter de nueva línea válido para el sistema operativo en el que PHP se está ejecutando.

Ésta es una cadena válida heredoc:

$text = <<<EOT 
Hello! 
EOT; 

Esta cadena heredoc no ha sido cerrado y   EOT; se considera parte de la cadena:

$text = <<<EOT 
    Hello! 
    EOT; 

El ejemplo anterior fija:

$text = <<<EOT 
    Hello! 
EOT; 

A heredoc dentro de una llamada de función (tenga en cuenta que ); debe aparecer en una nueva línea de trabajo):

print(<<<EOT 
Hello! 
EOT 
); 

Lo mismo que el anterior con sangrado muy raro (tenga en cuenta que la única cosa en la línea de identificador de cierre es el identificador y un salto de línea). Hello! tendrá cinco espacios antes en la cadena:

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

He aquí un intento de un ejemplo que cubre todos los usos posibles de ambos heredoc y 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"; 
} 
?>