Каковы плюсы и минусы использования нотации 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!
это плохой способ кодирования или хорошем смысле?
Вы имеете в виду это хорошая практика или плохая практика?
Как правило, нет ничего плохого в его использовании. Я бы даже сказал, что что-то не так с не используя это:
- вам не нужно избегать одиночных и двойных кавычек
- позволяет добавлять к предыдущей переменной при определении "контекста"
- позволяет прямая разметка без PHP (например, Javascript), которая будет использоваться вместе с PHP; делает код без PHP заметным
- нет заметных различий в производительности[*]. Тем не менее, это тривиально.
конечно нет ничего плохого с $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, которые я нахожу, в версии с одной кавычкой. Я также не люблю убегать, поэтому метод одной цитаты выглядит для меня самым аккуратным.
но это только мое мнение....