2011-09-28 10 views
5

ここで誰かがheredocをPHPのサンプルコードを使って複雑にすることができますか?マニュアルに記載されている内容に基づいていますか?PHP Heredoc String Rules

php.netのマニュアルは言う:

終端IDがある行には、セミコロン(;)以外の他の文字が含まれていない必要があることに注意することは非常に重要です。これは特に、識別子がインデントされていない可能性があり、セミコロンの前後にスペースやタブがないことを意味します。また、終了識別子の前の最初の文字は、ローカルオペレーティングシステムによって定義された改行でなければならないことに気づくことも重要です。これは、Mac OS Xを含むUNIXシステムでは\nです。終了デリミタ(場合によってはセミコロンが続きます)に改行が続く必要があります。

このルールが壊れていて、終了識別子が「クリーン」でない場合、クローズ識別子とみなされず、PHPは引き続き1つを探します。現在のファイルの最後の前に適切な終了識別子が見つからない場合は、最後の行に解析エラーが発生します。

Heredocsを使用してクラスプロパティを初期化することはできません。 PHP 5.3以降、この制限は変数を含むheredocに対してのみ有効です。ここで

PHPマニュアルへのリンクです:http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

+0

意味ですか? –

+0

クラスメソッドの一部であるheredoc文字列を自動的にインデントします。 Zend Studioのような一部のIDEでは、コードを選択して自動的にインデントすることができます。それは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; 

重要なのは、終了タグ」は後に定義されるように正確に同じであるということです< < < "であり、終了タグはインデントなしで配置されます(タブはなく、完全に左に粘着性があります)。

注:「_」は必須ではありませんが、私はこれを使用して、閉じているheredocをよりよく示すことができます。

+0

クラスメソッドの一部であればどうなりますか?コードを読みやすくするためにインデントする必要がありますか?右? – stackoverflowpro

+0

申し訳ありませんが、あなたが何を求めようとしているのか分かりません。 – JNDPNT

+0

私が言ったことは、上記のコードがPHPクラスの一部であり、コードを書式設定する必要がある場合は、おそらく終了区切り文字をインデントする必要があります。それはルールを破るだろうか? – stackoverflowpro

5

終わりのheredoc識別子は、行頭と識別子の間に全く文字を入れてはならない(MUST NOT)。後でただ一つの;を持っていてもいけません。識別子がインデントされると、それはheredoc文字列の一部として扱われなければならない。改行の前に現れる唯一の文字は;です。識別子と;の間、または;と改行の間に空白を含めることさえできません。つまり、関数呼び出しの中でheredocを使用する場合は、終了識別子の直後(つまり、,または)などの前)に改行を挿入する必要があります。

つまり、終了識別子付きの行に表示できるのは、識別子そのものと、オプションで識別子の直後にセミコロン(;)が1つあります。次の文字列(End-Of-Fileにない場合)は、PHPが実行されているオペレーティングシステムの有効な改行文字でなければなりません。

これは有効なヒアドキュメント文字列である:このヒアドキュメント文字列が閉じられていないと  EOT;が文字列の一部とみなされ

$text = <<<EOT 
Hello! 
EOT; 

:前の例では、固定

$text = <<<EOT 
    Hello! 
    EOT; 

$text = <<<EOT 
    Hello! 
EOT; 

関数呼び出し内のheredoc(に注意してください。)が動作するように新しい行に表示されている必要があります。

print(<<<EOT 
Hello! 
EOT 
); 

非常に奇妙なインデント(終値識別子ライン上の唯一のことは、識別子と改行であることに注意してください)と、上記と同じ。ここで

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

ヒアドキュメントとnowdocの両方のすべての可能な用途をカバーして例の試みです:Hello!は、文字列内のそれの前に5つのスペースを持って、あなたはどのような複雑さを

<?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"; 
} 
?>