Может ли кто-нибудь здесь изучить тонкости использования heredoc в PHP с помощью примеров PHP-кода? , на основе того, что говорится в руководстве ниже?
Руководство php.net говорит:
Очень важно отметить, что строка с закрывающим идентификатором не должна содержать других символов, кроме, возможно, точки с запятой (
;). Это означает, что идентификатор не может быть отступом, и не должно быть пробелов или вкладок до или после точки с запятой. Также важно понимать, что первый символ перед закрывающим идентификатором должен быть новой строкой, определенной локальной операционной системой. Это\nв системах UNIX, включая Mac OS X. Заключительный разделитель (возможно, за которым следует точка с запятой) также должен следовать новой строке.Если это правило нарушено, а закрытый идентификатор не является «чистым», он не будет считаться закрывающим идентификатором, а PHP продолжит искать его. Если правильный идентификатор закрытия не найден до конца текущего файла, в последней строке будет отображаться ошибка синтаксического анализа.
Heredocs нельзя использовать для инициализации свойств класса. Начиная с PHP 5.3 это ограничение допустимо только для heredocs, содержащих переменные.
Вот ссылка на руководство по php: http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc
это простое использование:
$bar = "stackoverflowpro"; $foo = <<<HTML <p>Hello $bar</p> HTML;
echo <<< _html ... some html code here ... _html;
Важно отметить, что закрывающий тег точно такой же, как определенный после «<<<», и что закрывающий тег помещается без отступа (без вкладок, полностью липких слева) и закрывается «;».
Примечание: «_» не требуется, но я использую его для указания лучшего, который является закрытым heredoc.
Закрывающий идентификатор heredoc НЕ ДОЛЖЕН иметь никаких символов между началом строки и идентификатором, он МОЖЕТ иметь один ; НЕМЕДЛЕННО после этого и НЕ ДОЛЖЕН иметь никаких других символов после него. Если идентификатор получает отступ, он должен рассматриваться как часть строки heredoc. Единственный символ, который может появиться перед новой строкой ; , Вы даже не можете включать пробелы между идентификатором и ; или между ; и новой строки. Это означает, что если вы используете heredoc внутри вызова функции, вы должны вставить разрыв строки сразу после закрывающего идентификатора (т.е. до любого , или ) и т. Д.).
Другими словами, единственное, что может появиться на линии с закрывающим идентификатором, это сам идентификатор и, возможно, одна точка с запятой ( ; ) сразу после идентификатора. Следующий chararcter (если не в End-Of-File) ДОЛЖЕН быть допустимым символом новой строки для операционной системы, на которой работает PHP.
Это допустимая строка heredoc:
$text = <<<EOT Hello! EOT;
Эта строка heredoc не была закрыта и EOT; считается частью строки:
$text = <<<EOT Hello! EOT;
В предыдущем примере исправлено:
$text = <<<EOT Hello! EOT;
Heredoc внутри вызова функции (обратите внимание, что ); должен появиться на новой строке для работы):
print(<<<EOT Hello! EOT );
То же самое, что и выше, с очень странным отступом (обратите внимание, что единственное, что на закрывающей строке идентификатора – это идентификатор и новая строка). Hello! будет иметь пять пробелов перед ним в строке:
print(<<<EOT Hello! EOT );
Вот попытка на примере, которая охватывает все возможные использования как heredoc, так и nowdoc:
<?Php if (isset($_GET['css'])) { // SET THE CONTENT TYPE header("Content-type: text/css"); echo // ECHO THE CSS STRING USING HEREDOC // AS YOU NOTICE HERE, WE INSERT THE GET DATA WITH "{}" TO MAKE IT EASIER TO DISTINGUISH THE VARIABLES <<<MYCSS button#{$_GET['css']} { color:white; background-color:black; padding:10px; } MYCSS; // IMMEDIATELY EXIT THE PHP SCRIPT TO SKIP THE REST OF THE CODE exit(); } else if (isset($_GET['js'])) { // SET THE CONTENT TYPE header("Content-type: text/javascript"); echo // ECHO THE JAVASCRIPT STRING USING HEREDOC // AS YOU NOTICE HERE, WE INSERT THE GET DATA WITH "{}" TO MAKE IT EASIER TO DISTINGUISH THE VARIABLES <<<MYJS function doSomething(param) { alert(param); } $(document).ready ( function() { $("button#{$_GET['js']}").click ( function() { doSomething('do me'); } ); } ); MYJS; // IMMEDIATELY EXIT THE PHP SCRIPT TO SKIP THE REST OF THE CODE exit(); } $myAjax = 'https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js'; $buttonID = md5(time().rand(111111,999999)); $myBottom = "\t".'\tlower body'; $doMe= "give head"; $head = <<<GIVEAHEAD <html> <head> <title>An advanced use of heredoc and more</title> <script type='text/javascript' src="$myAjax"></script> <script type='text/javascript' src="{$_SERVER['PHP_SELF']}?js={$buttonID}"></script> <link rel="stylesheet" href="{$_SERVER['PHP_SELF']}?css={$buttonID}" type='text/css'> </head> GIVEAHEAD; // HERE'S A VARIETY OF WAYS YOU CAN INSERT A HEREDOC INSIDE A FUNCTION echo iScream ( $doMe, $head ,<<<SHOWMYBODY <body> SHOWMYBODY . <<<_TATSMAHBAREH <button id='$buttonID'>touch me _TATSMAHBAREH // YOU CAN BASICALLY PUT YOUR '.' ANYWHERE BEFORE A HEREDOC, BUT NOT AFTER A HEREDOC .pushIt(). <<<"FINISHOFF" {$myBottom} \taye\n FINISHOFF // A NOW DOC IS THE EQUIVALENT OF SINGLE QUOTE STRINGS // IT DOES NOT RECOGNIZE VARIABLES OR \t AND \n ,<<<'ThisIsANowDoc' $ThisWillNotBeTreatedAsAVariable \tnope </body> </html> ThisIsANowDoc // A HEREDOC OR A NOWDOC CAN BE FOLLOWED BY A SEMICOLON (;), BUT NOT WITH ANYTHING ELSE ); // RETURNING A HEREDOC FROM A FUNCTION function pushIt() { return <<<YOLO </button> YOLO; // ENDING A HEREDOC; YOU CANNOT PUT ANYTHING ELSE // AFTER THE SEMICOLON - NOT EVEN A WHITESPACE } function iScream($act,$insert,$here,$below) { if($act == 'give head') return "$insert$here$below"; } ?>