2011-09-28 83 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"; 
} 
?>