Преимущества/неудобства heredoc и nowdoc в php

Как новичок, мне посоветовали предпочтительно использовать heredoc по сравнению со слишком большим количеством вложенных кодов (см. Неожиданный T_ELSE в php-коде).

Но я не могу понять, есть ли существенная разница между heredoc и nowdoc.

Каковы были бы преимущества для heredoc и nowdoc по сравнению с другим, которые были бы важны для понимания новичком (т.е. не очень незначительные преимущества, но важные для понимания для меня).


person Mathieu    schedule 22.06.2012    source источник


Ответы (4)


Nowdocs относится к строкам в одинарных кавычках так же, как heredocs к строкам в двойных кавычках. Nowdoc определяется так же, как heredoc, но внутри nowdoc не выполняется синтаксический анализ. Эта конструкция идеально подходит для встраивания кода PHP или других больших блоков текста без необходимости экранирования.

http://php.net/manual/en/language.types.string.php#language.types.string.syntax.nowdoc

Другими словами:

$foo = 'bar';

$here = <<<HERE
    I'm here, $foo !
HERE;

$now = <<<'NOW'
    I'm now, $foo !      
NOW;

$here означает я здесь, bar !, а $now означает я сейчас, $foo !.

Если вам не нужна интерполяция переменных, но нужны специальные символы, такие как $ внутри вашей строки, Nowdocs проще в использовании. Это все.

person deceze♦    schedule 22.06.2012
comment
если у меня есть html-разметки (например: ‹a hrefW› ‹strong› для добавления в сообщение (в вашем примере: I'm now, $foo!), лучше с точки зрения скорости/эффективности кода использовать nowdoc ?, и если мне нужно включить переменную, которую я хочу интерпретировать, я бы использовал herdeoc? - person Mathieu; 22.06.2012
comment
В плане скорости это мало что изменит. Используйте то, что имеет больше смысла. - person deceze♦; 22.06.2012

heredocs
1. Текст heredocs ведет себя так же, как строка в двойных кавычках, без двойных кавычек.
2. Кавычки в heredoc не нужно экранировать, но коды перехода \n перевод строки,
\r возврат каретки, \t горизонтальная табуляция, \v вертикальная табуляция, \e escape, \f перевод страницы, \ обратная косая черта, \$ знак доллара, \" двойные кавычки
все еще могут использоваться. Переменные расширяются, но при выражении сложных переменных внутри heredoc необходимо соблюдать такую ​​же осторожность, как и при выражении строк.

Пример :

$myname='Tikku';
$heredoc_exmaple= <<<HEREDOC
\\n ,\\r ,\t ,\r ,\\v ,\\e ,\f ,\\ , \ ,$89 ,$ , $myname , ' , \$myname ,  \" ,\'
HEREDOC;
echo $heredoc_exmaple;

//OUTPUT \n ,\r ,   , ,\v ,\e , ,\ , \ ,$89 ,$ , Tikku , ' , $myname , \" ,\'

nowdocs
1. Текст nowdocs ведет себя так же, как строка в одинарных кавычках, без одинарных кавычек.
2. Кавычки в nowdocs не нужно экранировать. Переменные в нем не раскрываются. Преимуществом nowdocs является встраивание кода PHP и экранирующих кодов без необходимости экранирования.

Пример :

$myname='Tikku';
$nowdoc_exmaple= <<<'NOWDOC'
\\n ,\\r ,\t ,\r ,\\v ,\\e ,\f ,\\ , \ ,$89 ,$ , $myname  , ' , \$myname ,  \" ,\'
NOWDOC;

echo $nowdoc_exmaple;

//OUTPUT \\n ,\\r ,\t ,\r ,\\v ,\\e ,\f ,\\ , \ ,$89 ,$ , $myname , ' , \$myname , \" ,\'

Синтаксис: Nowdoc идентифицируется той же последовательностью ‹‹‹, которая используется для heredocs, но следующий идентификатор заключен в одинарные кавычки, например ‹‹‹ «НОВДОК». Все правила для идентификаторов heredoc также применяются к идентификаторам nowdoc, особенно те, которые касаются внешнего вида закрывающего идентификатора.

person Dhairya Lakhera    schedule 13.10.2017

Nowdoc отлично подходит, когда вы не хотите иметь дело с кавычками и раскатывателями сложных строк, так как он не интерпретирует никакие кавычки и не принимает переменные. Таким образом, он хорошо подходит для ручного отображения фрагментов кода!

Однако, если вы используете смесь heredocs и nowdocs для блоков строкового содержимого, что является легким искушением, вы можете легко столкнуться с проблемами XSS (межсайтового скриптинга) везде, где бы вы ни использовали heredoc! Таким образом, этот подход недостаточно ясен, чтобы рекомендовать его разработчику, начинающему с php! Вместо этого вы должны пытаться использовать шаблоны (любого типа или любого механизма шаблонов, который вам нравится) для этих больших блоков информации. В конце концов, вы не хотите, чтобы html был в вашем php, и вы, конечно же, не хотите, чтобы пользователь вводил javascript, например:

$username = '<script>alert(document.cookie.toString())</script>';

$insecure_example = <<<HERE
    I really like having my site exploited, $username
HERE;

Так что не используйте HEREDOCS и NOWDOCS вместо надлежащего подхода к шаблонам или механизма шаблонов.

Везде, где есть интерфейс между языками или технологиями, вы должны кодировать. php в sql? связывать. php в html? кодировать. http на php?

person Kzqai    schedule 16.11.2012
comment
Ужасный совет. Вместо этого узнайте, что такое уязвимость межсайтового скриптинга и как дезинфицировать ввод. Это фундаментальные концепции серверного программирования, которые не слишком сложны для понимания новичком. Использование системы шаблонов, чтобы избежать необходимости учиться защищать свое приложение, делает разработчика зависимым от костыля, который может иметь или не иметь свои собственные уязвимости. Не говоря уже о том, что полноценная система шаблонов обычно избыточна для проектов, за которые собирается взяться новичок. - person siliconrockstar; 30.12.2013
comment
Вы думаете, что новичок сможет изучить все проблемы с XSS, очисткой и экранированием ввода, но считаете, что система шаблонов излишняя. Я думаю, вы ошибаетесь в том, какой вариант в среднем приведет к лучшим результатам. Это не значит, что обучение xss и экранированию — это плохо, но это сложная тема, которая должна начинаться с хорошего стандарта экранирования по умолчанию, что, как правило, является тем, что вы получаете только с помощью механизма шаблонов, и новичкам не следует сверните свой собственный механизм шаблонов. - person Kzqai; 31.12.2013
comment
Межсайтовый скриптинг (XSS) или «Зачем избегать вывода» Допустим, у вас есть веб-форум. Что, если злоумышленник создаст такое сообщение: «Я люблю форумы.‹script type=text/javascript›window.location.href=malicioussite.com/malware-download-page;‹/script›' Когда этот пост на форуме будет показан другим пользователям, этот javascript отправит их на сайт атаки! Поэтому избегайте вывода — вы можете использовать strip_tags() перед рендерингом вывода или использовать htmlspecialchars() или htmlentities() для преобразования символов html, таких как '‹' и '›', в объекты HTML, такие как '' и ''. Механизмы шаблонов предназначены для дизайнеров. - person siliconrockstar; 04.01.2014
comment
Как разработчик, вы никогда не должны допускать такой простой ошибки. Не используйте heredoc или nowdoc для создания общедоступных представлений. Эти методы невероятно полезны, если вы не делаете с ними глупостей. В настоящее время я использую nowdoc для создания шаблонов cakephp, которые не анализируют пользовательский ввод. - person Michael Ozeryansky; 01.08.2014
comment
Я не согласен с @siliconrockstar. Этот ответ не о том, чтобы посоветовать людям не узнавать о xss; на самом деле, чтение фрагмента кода заставит наблюдательный ум задуматься, что там происходит. Давать начинающим программистам подсказки о том, чего не следует делать, пока они не поймут, что делают, совершенно нормально. - person Félix Adriyel Gagnon-Grenier; 07.07.2016
comment
@FélixGagnon-Grenier - я не советовал изучать XSS, я рекомендовал его. Даже у новичков должно быть базовое понимание XSS, CSRF и SQL-инъекций. - person siliconrockstar; 09.07.2016
comment
@siliconrockstar Я знаю. Этот ответ не о совете людям не узнавать о xss, это не значит, что я думаю, что вы это делаете. Это означает, что я не согласен с вашим утверждением, что это ужасный совет по указанным причинам. - person Félix Adriyel Gagnon-Grenier; 09.07.2016
comment
Единственный «ужасный совет» заключался в том, чтобы предложить новичку PHP, который даже не понимает экранирование и одиночные и двойные кавычки, использовать механизм шаблонов, чтобы избежать XSS. Вы пропускаете некоторые шаги там. - person siliconrockstar; 09.07.2016
comment
Хороший способ мысленно защититься от XSS или других видов внедрения — назвать ваши переменные, например, $username_unsafe и $username_safe, а затем узнать, какая функция очистки переводит вас из одного значения в другое. - person donquixote; 07.04.2020
comment
В общем, если вы считаете, что heredoc небезопасен, то же самое относится к простой конкатенации строк и к переменным, вставленным в строки в двойных кавычках. - person donquixote; 07.04.2020
comment
Альтернативой не обязательно должен быть механизм шаблонов. Что также работает, так это функция замены строки со встроенной очисткой, например, format_string() в Drupal. Вы можете использовать это в сочетании с nowdoc. Или, если это запрос к базе данных, типичный построитель запросов будет иметь механизм замены строки со встроенной очисткой, подходящей для SQL. - person donquixote; 07.04.2020

Heredoc в 1000 раз быстрее, чем text, echo 'text' и nowdoc.

Sql1 с эхом = 0,00011205673217773

sql2 с heredoc = 9.7751617431641E-6

Результат = Sql1 медленнее на 1046,3414634146%.

person Francisco Aragon    schedule 27.12.2020