Преимущества/неудобства heredoc vs nowdoc в php
Как новичок, мне рекомендуется использовать heredoc по сравнению со слишком большим количеством вложенных кодов (см. Неожиданный T_ELSE в php-коде).
Но я не могу понять, существует ли существенная разница между heredoc и nowdoc.
Каковы были бы преимущества для heredoc и nowdoc по сравнению с другими, которые были бы важны для новичков, чтобы понять (т.е. не очень незначительные преимущества, но важные для понимания для меня).
Ответы
Ответ 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, особенно к появлению закрывающего идентификатора.