Каковы плюсы и минусы использования нотации Heredoc в вашем PHP?

Я никогда не видел ничего подобного раньше. Это сбивает меня с толку. Но теперь я понимаю и иногда использую его. Итак, после короткого опыта, может ли кто-нибудь сказать мне, что за и против использования нотации Heredoc в вашем PHP?

$stringval = <<<MYHEREDOC

   just creating variable here. nothing more.

MYHEREDOC;

лично, как вы используете эту функцию PHP? Это плохой способ кодирования или хороший?

8 ответов


99% времени я использую это для SQL-запросов, например:

$sql = <<<END
SELECT *
FROM sometable
WHERE value > 100
ORDER BY name
END;

мне легче обнаружить такие запросы в исходном коде и скопировать и вставить их во что-то, чтобы запустить их. Ваш пробег может отличаться. Примечание: вы можете делать многострочные с нормальными строками. Я склонен избегать этого, однако, поскольку первая строка имеет отступ по-разному к остальным.

самый большой "pro", насколько я обеспокоен, заключается в том, что вам не нужно избегать кавычек. Это особенно важно. с разметкой. Решите сами, что легче читать. Предполагая:

$name = 'foo';
$type = 'text';
$value = 'Default value';

Версия 1: одинарные кавычки

$html = '<input type="' . $type . ' name="' . $name . '" value="' . $value . '">';

Версия 2: двойные кавычки

$html = "<input type=\"$type\" name=\"$name\" value=\"$value\">";

версия 3: heredoc

$html = <<<END
<input type="$type" name="$name" value="$value">
END;

Примечание: в версии 2 Вы можете, конечно, использовать одинарные кавычки для значений атрибутов для решения проблемы экранирования, но дело в том, что вам нужно беспокоиться о таких вещах. Лично мне не нравится смешивать типы цитат атрибутов в разметке любой.


теперь есть два типа "Heredoc":

  • помощи heredoc, подобно кавычкам "" преобразует любые переменные в их значение при создании. Это очень полезно для размещения точного интервала / возвратов, где они вам нужны (нет необходимости в \n или \t).
  • Nowdoc, подобно одиночным меткам '' будет не преобразование любых переменных и сохраняет только текстовое значение. Это можно использовать в значениях по умолчанию класса переменные (в отличие от heredoc).

Помощи Heredoc Пример:

$value = 5;
$string = <<<EOL
The number is $value
EOL;
// The number is 5

Nowdoc Пример:

$value = 5;
$string = <<<'EOL'
The number is $value
EOL;
// The number is $value

EDIT: единственный недостаток, о котором я могу думать, это то, что конечные символы (в примерах, EOL) должны предшествует 0 пробелов. Это трудно запомнить и выглядит уродливо, когда внутри вложенных функций:

function foo() {
  if ($bar) {
    $string = <<<LINE
Hey, how is it going, $name.
This is a great test of Heredoc and Nowdoc.
Blah blah blah, go upvote me!
LINE;
  }
}

Ну, pro(S) это

  • это удобно для больших кусков текста с цитатами

и CONS

  • вам редко, если когда-либо нужны большие куски текста в MVC
  • разрывы вмятины
  • имеет некоторые причуды, если используется с классами (до 5.3)

лично я им не пользуюсь.

(обязательная оговорка о все это является вопросом предпочтения и т. д.)


Я не использую его вообще. Это было очень полезно в Perl, так как Perl не имел функции HTML escape. Итак, PHP делает, и если я хочу распечатать большой объем текста, я бы просто закрыл тег PHP и набрал текст как есть. В любом другом случае старые добрые двойные кавычки устраивает.


HEREDOCs очень полезны для сброса больших сгустков текста в переменную или непосредственно клиенту. Это также экономит несколько конкатенаций, если вы создаете длинную многострочную строку. Единственный главный недостаток-вам нужно предварительно обработать любые данные, которые вы будете вставлять.

echo <<<EOF
<input type="text" name="foo" value="$bar" />

EOF;

очень удобочитаем, особенно с редактором подсветки синтаксиса. Но вам нужно предварительно обработать $bar с помощью htmlspecialchars () вне heredoc (для экранирования кавычек), поэтому вы в конечном итоге с:

$bar = htmlspecialchars($bar);
echo <<<EOF
etc....

тогда как если вы находитесь в "режиме html", вы можете использовать:

<input type="text name="foo" value="<?php echo htmlspecialchars($bar) ?>" />

или

echo '<input type ... snip ... value="' . htmlspecialchars($bar) . etc....

как правило, вам не нужно хранить экранированную версию данных, поэтому вы можете также выгрузить ее непосредственно и сохранить шаг присвоения переменной. HEREDOCs не позволяют вам это делать, так как вы не можете вставить вызов функции в них напрямую.


очень полезно иметь очень аккуратный стиль программирования, разделяющий html с php. Ваши php-коды будут очень удобочитаемыми и понятными. Это значительно облегчает debbuging коды. Это позволяет больше сосредоточиться на логике программы, а не на презентации с html. Вам просто нужен один оператор echo, а не раздражающие скрипты php во всем вашем html. Чтобы проиллюстрировать, как он используется, вот пример.

masterpage.в PHP

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title><?php $title ?></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="../js/jquery.min.js" type="text/javascript"></script>
        <link href="../bsa.css" rel="stylesheet" type="text/css">
         <script language="javascript" type="text/javascript" src="../js/sortEligibility.js"></script>
     <body>
            <div id="maincontainer">        
    <div id="menu">
                <ul id="navtop">
                    <li><*linkhere* title="Home">Home</a></li>
                    <li >*linkhere* title="Eligibility">Eligibility</a></li>
                    <li >*linkhere*  title="Registration  List">Registration</a></li>
                    <li ><*linkhere*" title="BSA Ranks and Requirements ">BSA Ranks</a></li>
                    <li><*linkhere*  title="Merit Badges">Merit Badges</a></li>                   
                </ul>
            </div>

            <div id='contentcolumn'>
                <?php  echo "<h2>".$title."</h2>".$bodyhtml;?>
                 </div>
            <div id="footer">Footer</div>
        </div>
    </body>
</html>

meritBadges.в PHP

<?php
//include dbase connection
include("*linkhere*/includes/dbconnect.php");
//this page is called where the  value id_scout is sent through GET
//Show required output
$result = mysql_query("SELECT e.id_merit, m . *
FROM bsa_merits AS m
LEFT JOIN bsa_earned_merits AS e ON e.id_merit = e.id_merit
WHERE id_scout = '{$_GET[id_scout]}'");
while($row = mysql_fetch_assoc($result)){
    $body .=<<<__HTML_END
<td align="center"><img_src="*linkhere*/MeritBadges_Files/{$row['filename']}"><br>{$row['merit']}</td>
__HTML_END;       
}
if(!empty($body)){
$bodyhtml =<<<__HTML_END
Earned Merits:
<table border="0" cellpadding="5" cellspacing="0">
<tr>
$body
</tr>
</table>
__HTML_END;
}
else{
die ("There is nothing to display");
}
mysql_free_result($result);
$title="Merit Badges" ;
include("masterpage.php");
?>

все остальные страницы могут быть созданы по аналогии с приведенным выше примером. Помните, что вы просто создаете одну большую строку для вывода и отображаете ее в файле hmtl только с одним эхом! Просто проанализируйте вышеуказанные коды и посмотрите, как вы можете улучшить свое Программирование php с помощью heredoc!


это плохой способ кодирования или хорошем смысле?

Вы имеете в виду это хорошая практика или плохая практика?

Как правило, нет ничего плохого в его использовании. Я бы даже сказал, что что-то не так с не используя это:

  1. вам не нужно избегать одиночных и двойных кавычек
  2. позволяет добавлять к предыдущей переменной при определении "контекста"
  3. позволяет прямая разметка без PHP (например, Javascript), которая будет использоваться вместе с PHP; делает код без PHP заметным
  4. нет заметных различий в производительности[*]. Тем не менее, это тривиально.

конечно нет ничего плохого с $var = "Welcome, <b>$user</b>;" - однако это не идеально, если вы собираетесь работать с больших количествах чужого кода и желание поддерживать читаемость:

действительно, это идеальный способ справиться с разметкой, такой как HTML, если вы не можете вывести его напрямую.

[*]на основе личных тестов, но должен оставаться верным независимо.


хотя приемлемо использовать HEREDOC, основным недостатком, на мой взгляд, является то, что большинство IDE теряют способность отслеживать код и часто отображают сообщения, в которых закрывающие теги не могут быть найдены, особенно если открывающий тег внутри другого HERDOC до конца тега или код представляет собой смесь всех стилей. Одно из приложений, которое я унаследовал, было повсюду. Например.

echo <<<PART1
<table>
   <tr>
   ....
   </tr>
PART1;
//more php code
?>
</table>

это плохой пример, когда некоторый код находится в HEREDOC, например начало таблица, а затем намного позже вниз по коду, таблица закрывается обычно за пределами тегов PHP. Моя IDE (phpstorm 2017) жалуется, что не может найти соответствующие теги таблиц.

по этой причине я всегда преобразую HEREDOCs, которые я нахожу, в версии с одной кавычкой. Я также не люблю убегать, поэтому метод одной цитаты выглядит для меня самым аккуратным.

но это только мое мнение....