web-dev-qa-db-ja.com

PHPのheredocとnowdocの利点/不便さ

初心者として、ネストされたコードが多すぎる場合と比較して、できればheredocを使用することをお勧めします(phpコードの Unexpected T_ELSEを参照してください )。

しかし、heredocとnowdocの間に大きな違いがあるかどうかを理解することはできません。

ヒアドックとノウドックの利点は、初心者が理解するのに重要な他の利点と比較してどうでしょうか(つまり、あまり重要ではない利点ではなく、私にとって理解することが重要です)。

40
Mathieu

Nowdocsは一重引用符で囲まれた文字列であり、heredocsは二重引用符で囲まれた文字列です。 nowdocは、heredocと同様に指定されますが、nowdoc内では解析は行われません。 PHPコードまたは他の大きなテキストブロックをエスケープせずに埋め込むのに理想的です。

http://php.net/manual/en/language.types.string.php#language.types.string.syntax.nowdoc

言い換えると:

$foo = 'bar';

$here = <<<HERE
    I'm here , $foo !
HERE;

$now = <<<'NOW'
    I'm now , $foo !      
NOW;

$here "私はここにいる、バー!"$now 「今は$ foo!」

変数の補間は必要ないが、文字列内に$などの特殊文字が必要な場合、Nowdocsの方が使いやすいです。それで全部です。

104
deceze

heredocs
1。 heredocs textは、二重引用符なしの二重引用符付き文字列のように動作します。
2。 heredoc内の引用符はエスケープする必要はありませんが、エスケープコード\ n改行、
\rキャリッジリターン、\ t水平タブ、\ v垂直タブ、\ eエスケープ、\ fフォームフィード、\バックスラッシュ、\ $ドル記号、\ "二重引用符
は引き続き使用できます。変数は展開されますが、文字列と同様にheredoc内で複雑な変数を表現するときは同じ注意が必要です。

例:

$myname='Tikku';
$heredoc_exmaple= <<<HEREDOC
\\n ,\\r ,\t ,\r ,\\v ,\\e ,\f ,\\ , \ ,$89 ,$ , $myname , ' , \$myname ,  \" ,\'
HEREDOC;
echo $heredoc_exmaple;

//OUTPUT \n ,\r ,   , ,\v ,\e , ,\ , \ ,$89 ,$ , Tikku , ' , $myname , \" ,\'

nowdocs
1。 nowdocsテキストは、単一引用符なしの単一引用符付き文字列のように動作します。
2。 nowdocs内の引用符はエスケープする必要はありません。変数はその中に展開されません。nowdocsの利点は、PHPコードとエスケープエスケープする必要のないコード。

例:

$myname='Tikku';
$nowdoc_exmaple= <<<'NOWDOC'
\\n ,\\r ,\t ,\r ,\\v ,\\e ,\f ,\\ , \ ,$89 ,$ , $myname  , ' , \$myname ,  \" ,\'
NOWDOC;

echo $nowdoc_exmaple;

//OUTPUT \\n ,\\r ,\t ,\r ,\\v ,\\e ,\f ,\\ , \ ,$89 ,$ , $myname , ' , \$myname , \" ,\'

構文:nowdocは、ヒアドキュメントと同じ<<<シーケンスで識別されますが、その後の識別子は単一引用符で囲まれます。 <<< 'NOWDOC'。ヒアドキュメント識別子のすべてのルールは、nowdoc識別子、特に終了識別子の外観に関するルールにも適用されます。

2
Dhairya Lakhera

Nowdocは、複雑な文字列の引用と非引用を処理したくない場合に最適です。引用を解釈せず、変数を受け入れないためです。そのため、実際のコードスニペットを手動で表示するのに適しています。

しかし、文字列コンテンツのブロックにヒアドキュメントとノウドキュメントを組み合わせて使用​​している場合、これは陥りやすい誘惑であり、ヒアドキュメントを使用するとXSS(クロスサイトスクリプティング)の問題が発生しやすくなります。そのため、このアプローチは、PHPで開発を始める開発者に勧めるほどクリーンではありません!代わりに、これらの大きな情報ブロックには、テンプレート(どんな種類のテンプレートでも、好きなテンプレートエンジンでも)を使用する必要があります。結局のところ、PHPにHTMLは不要であり、次のように、ユーザーが挿入したjavascriptは必要ありません。

$username = '<script>alert(document.cookie.toString())</script>';

$insecure_example = <<<HERE
    I really like having my site exploited, $username
HERE;

したがって、適切なテンプレートアプローチまたはテンプレートエンジンの代わりにHEREDOCSとNOWDOCSを使用しないでください。

1
Kzqai