Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Nowdocs - это строки с одним кавычком, что heredocs - это строки с двойными кавычками. A 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: "Я здесь, бар!", а $now - "Я сейчас, $foo!".

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

Ответ 2

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 вместо правильного подхода к шаблонам или механизма шаблонов.

Ответ 3

heredocs
1. heredocs текст ведет себя как строка с двойными кавычками без двойных кавычек.
2. Котировки в heredoc не должны быть экранированы, но escape-коды \n linefeed,
\ r возврат каретки, \ t горизонтальная вкладка, \v вертикальная вкладка, \e escape,\f form feed,\backslash,\$знак доллара,\ "двойная кавычка
все еще можно использовать. Переменные расширены, но такая же осторожность должна приниматься при выражении сложных переменных внутри 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 и escape-кодов без необходимости экранирования.

Пример:

$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 , \" ,\'

Синтаксис: A теперь doc идентифицирован с тем же < последовательность, используемая для heredocs, но следующий идентификатор заключен в одинарные кавычки, например. & Л; < < 'NOWDOC'. Все правила для идентификаторов heredoc также применяются к идентификаторам nowdoc, особенно к появлению закрывающего идентификатора.