¿Cuál es la ventaja de usar heredoc en PHP? [cerrado]

196

¿Cuál es la ventaja de usar heredoc en PHP, y puede mostrar un ejemplo?

danidacar
fuente
44
No hay una razón sólida por la que los suplentes sean mejores que los heredocs
Shakti Singh
18
Edité esto para que sea más constructivo, e hice el wiki de la comunidad de preguntas ya que es bastante subjetivo. Tenga en cuenta que la comunidad aún puede cerrar esto, elegí dejarlo abierto porque está obteniendo respuestas de calidad.
Tim Post
9
¿Por qué exactamente esta pregunta no se considera constructiva?
Ambo100

Respuestas:

218

La sintaxis heredoc es mucho más limpia para mí y es realmente útil para cadenas de varias líneas y evitar problemas de citas. En el pasado, solía usarlos para construir consultas SQL:

$sql = <<<SQL
select *
  from $tablename
 where id in [$order_ids_list]
   and product_name = "widgets"
SQL;

Para mí, esto tiene una probabilidad menor de introducir un error de sintaxis que el uso de comillas:

$sql = "
select *
  from $tablename
 where id in [$order_ids_list]
   and product_name = \"widgets\"
";

Otro punto es evitar escapar de las comillas dobles en su cadena:

$x = "The point of the \"argument" was to illustrate the use of here documents";

El pProblema con lo anterior es el error de sintaxis (la comilla escapada que falta) que acabo de presentar en lugar de la sintaxis del documento aquí:

$x = <<<EOF
The point of the "argument" was to illustrate the use of here documents
EOF;

Es un poco de estilo, pero uso lo siguiente como reglas para documentos simples, dobles y aquí para definir cadenas:

  • Las comillas simples se usan cuando la cadena es una constante como'no variables here'
  • Comillas dobles cuando puedo poner la cadena en una sola línea y requerir interpolación variable o una comilla simple incrustada"Today is ${user}'s birthday"
  • Aquí documentos para cadenas de varias líneas que requieren formato e interpolación variable.
Wes
fuente
40
Nitpick en su ejemplo de SQL: en primer lugar, no debe usar comillas dobles allí. Eso solo funciona con MySQL, y solo cuando ese servidor no se ejecuta en --ansimodo compatible. Las cadenas SQL deben usar comillas simples.
mario
17
@mario Fue para ilustrar el problema con el uso de comillas dobles en general, no sobre los detalles del sql
Wes
44
No quiere decir que colocar variables en una consulta directamente sea una mala, mala educación :-P
Your Common Sense
55
@Wes y @mario Esto es ANSI SQL:SELECT * FROM "order" WHERE "table"='1'
programaths
11
"No quiere decir que colocar variables en una consulta directamente es una mala, mala educación". Esto no es cierto en absoluto. Colocar entradas no validadas en las declaraciones SQL es "malos modales". A veces es necesario colocar variables dentro de las declaraciones SQL.
vogomatix
67

Los Heredoc son una gran alternativa a las cadenas citadas debido a la mayor legibilidad y facilidad de mantenimiento. No tiene que escapar de las comillas y los IDE (buenos) o editores de texto utilizarán el resaltado de sintaxis adecuado.

Un ejemplo muy común: hacer eco de HTML desde PHP:

$html = <<<HTML
  <div class='something'>
    <ul class='mylist'>
      <li>$something</li>
      <li>$whatever</li>
      <li>$testing123</li>
    </ul>
  </div>
HTML;

// Sometime later
echo $html;

Es fácil de leer y fácil de mantener.

La alternativa es hacer eco de las cadenas entre comillas, que terminan conteniendo comillas escapadas e IDE no van a resaltar la sintaxis de ese idioma, lo que conduce a una mala legibilidad y a una mayor dificultad en el mantenimiento.

Respuesta actualizada para su sentido común

Por supuesto, no querrá ver una consulta SQL resaltada como HTML. Para usar otros idiomas, simplemente cambie el idioma en la sintaxis:

$sql = <<<SQL
       SELECT * FROM table
SQL;
Jake Wilson
fuente
1
¿Conoces la función " escapar de PHP " de PHP ?
Su sentido común
55
A veces, escapar de PHP está bien, pero cuando haces eco de muchas cosas, tu resaltado de sintaxis se rompe, tienes que escribir más caracteres simplemente escapando de PHP y PHP tiene más comandos para ejecutar en lugar de un solo eco. Además, puede establecer una cadena Heredoc en una variable y repetirla más tarde. Escapar de PHP para su HTML significa que se imprime en ese momento. No se puede guardar para más tarde.
Jake Wilson
2
1. puede usar el almacenamiento intermedio de salida para guardar la salida. 2. Estaba utilizando echo en su primer ejemplo. 3. (bueno) IDE o editores de texto NUNCA rompan el resaltado de HTML cuando se utiliza el escape de PHP. 4. ¿Qué IDE resalta la sintaxis para HEREDOC y qué reglas de idioma se utilizan? ¿Está bien ver una consulta SQL resaltada como texto HTML?
Su sentido común
1
Un Heredoc es una cadena PHP. Por supuesto, no puede usar estructuras de control en una cadena. php.net/manual/en/language.types.string.php
Jake Wilson el
11
Creo que malinterpretas que Heredoc's solo se aplica a cadenas de HTML. Los Heredoc son simplemente una forma alternativa de definir una cadena, ya sea HTML o una consulta SQL o cualquier cosa que desee. Son más fáciles de escribir y mantener, la respuesta anterior de Wes lo muestra de manera bastante obvia (que si observa que tiene el resaltado de sintaxis correcto. No se queje de la falla de NetBeans). No estoy seguro de por qué parece tan empeñado en rechazar una respuesta en una pregunta de la wiki de la comunidad ... Lo creas o no, los desarrolladores originales de PHP pueden haber incluido Heredoc en PHP porque podría ser útil en algunos casos. .
Jake Wilson
8

Algunos IDE resaltan el código en las cadenas heredoc automáticamente, lo que hace que el uso de heredoc para XML o HTML sea visualmente atractivo.

Personalmente me gusta para partes más largas, es decir, XML, ya que no tengo que preocuparme por citar caracteres de comillas y simplemente puedo pegar el XML.

cweiske
fuente
6

En primer lugar, todas las razones son subjetivas. Es más una cuestión de gustos que una razón.

Personalmente, encuentro heredoc bastante inútil y lo uso ocasionalmente, la mayoría de las veces cuando necesito incorporar algo de HTML a una variable y no quiero molestarme con el búfer de salida, para formar un mensaje de correo electrónico HTML, por ejemplo.

El formateo no se ajusta a las reglas generales de sangría, pero no creo que sea un gran problema.

       //some code at it's proper level
       $this->body = <<<HERE
heredoc text sticks to the left border
but it seems OK to me.
HERE;
       $this->title = "Feedback";
       //and so on

En cuanto a los ejemplos en la respuesta aceptada, es simplemente hacer trampa.
Los ejemplos de cadenas, de hecho, son más concisos si uno no los engaña

$sql = "SELECT * FROM $tablename
        WHERE id in [$order_ids_list]
        AND product_name = 'widgets'";

$x = 'The point of the "argument" was to illustrate the use of here documents';
Su sentido común
fuente
3

No sé si diría que heredoc es pereza. Se puede decir que hacer cualquier cosa es pereza, ya que siempre hay formas más engorrosas de hacer cualquier cosa.

Por ejemplo, en ciertas situaciones es posible que desee generar texto, con variables incrustadas sin tener que buscar un archivo y ejecutar un reemplazo de plantilla. Heredoc le permite renunciar a las comillas, por lo que el texto que ve es el texto que genera. Claramente, hay algunos aspectos negativos, por ejemplo, no puedes sangrar tu heredoc, y eso puede ser frustrante en ciertas situaciones, especialmente si eres un fanático de la sintaxis unificada, que yo soy.

asnyder
fuente