2011-09-28 71 views
5

有人可以在这里探索在PHP中使用示例php代码片段使用heredoc的复杂? ,基于手册下面的内容?PHP Heredoc字符串规则

php.net手册说:

需要注意的是,结束标识符的行必须包含没有其他字符,可能除了分号(;)是非常重要的。这意味着特别是标识符可能不会缩进,并且在分号之前或之后可能没有任何空格或制表符。认识到关闭标识符之前的第一个字符必须是由本地操作系统定义的换行符也很重要。在UNIX系统上,这是\n,包括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

+0

你是什么意思复杂? –

+0

自动缩进作为类方法一部分的heredoc字符串。一些IDE,比如Zend Studio允许您选择代码并自动为您缩进。这将缩进heredoc字符串。是对的吗?你尝试过吗?我还没有,因为这对我来说很费时。我只是一个PHP初学者。但是,这是我脑海中的一个问题。 – stackoverflowpro

回答

8

这是一个简单的使用:

$bar = "stackoverflowpro"; 
$foo = <<<HTML 
<p>Hello $bar</p> 
HTML; 
+0

如果它是类方法的一部分呢?您需要缩进以获得代码可读性。对?你打算如何格式化包含你的代码的PHP类代码? – stackoverflowpro

+0

此代码可以既简单PHP页面内或方法内使用。在一个方法中使用的例子可能是返回变量$ foo,然后将它打印到任何你想要的地方! – JellyBelly

+0

遗憾的是,heredoc里面的代码无法格式化! – JellyBelly

6
echo <<< _html 

... some html code here ... 

_html; 

重要的是,关闭标签恰恰是后所定义的一样“ < < <“,而结束标记被放置而不缩进(无标签,完全粘到左)和闭合由‘;’。

注:“_”不需要,我却用它来表示更好的是它关闭定界符。

+0

如果它是类方法的一部分,该怎么办?你需要缩进代码的可读性?对? – stackoverflowpro

+0

对不起,我不明白你想问什么。 – JNDPNT

+0

我想说的是:如果你上面的代码是一个PHP类的一部分,你需要格式化您可能需要缩进结束定界符行的代码。这会违反规则吗? – stackoverflowpro

5

关闭的heredoc标识符在开始的行和标识符之间绝不能有任何字符,它可能在之后立即有一个单独的;,并且不能在其后面有任何其他字符。如果标识符被缩进,它必须被视为heredoc字符串的一部分。在换行符之前可能出现的唯一字符是;。您甚至不能在标识符和;之间或;和换行符之间包含任何空格。这意味着,如果使用定界符函数调用内部,则必须刚刚结束标识符之后插入一个换行(即前的任何,)等)。

换句话说,可以在与闭合标识符所在的行出现的唯一事情是该标识符之后立即标识符本身以及任选的一种分号(;)。下一个chararcter(如果不在文件结尾)必须是PHP运行的操作系统的有效换行符。

这是一个有效的定界符字符串:

$text = <<<EOT 
Hello! 
EOT; 

这定界符串尚未关闭并且  EOT;被认为是字符串的一部分:

$text = <<<EOT 
    Hello! 
    EOT; 

前面的例子固定:

$text = <<<EOT 
    Hello! 
EOT; 

函数调用内部的定界符(注意:);必须出现在新行的工作):

print(<<<EOT 
Hello! 
EOT 
); 

同上非常奇怪的压痕(注意,结束标识符行的唯一的事情是标识符和换行)。 Hello!将收到五个空格的字符串:

  print(<<<EOT 
    Hello! 
EOT 
        ); 
1

下面是一个例子,试图覆盖每一个可能同时使用定界符和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"; 
} 
?>