Может ли кто-нибудь здесь изучить тонкости использования 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"; } ?>