if / else与heredoc不符合预期

时间:2011-08-25 08:27:44

标签: php heredoc

我正在使用heredoc构建一个简单的文本电子邮件,但由于某种原因,我在if / else条件周围得到了奇怪的结果:

<?php 
$message = <<<EOD
Hi Username
EOD;

echo $message.'<hr>';

if(true) {
    $message .= <<<EOD
Thanks for logging in
EOD;                    
} else {
    $message .= <<<EOD
Thanks for signing up.  
EOD;
}       

echo $message.'<hr>';   

$message .= <<<EOD
Good Bye                    
EOD;
echo '<pre>'.$message.'</pre>';

输出:

Hi UsernameThanks for logging in
EOD;                    
} else {
    Hi Username .= <<<EOD
Thanks for signing up.  Good Bye    

出于某种原因,它正在输出我的PHP - 如果我将true更改为false,我只会得到Hi UsernameGood Bye,这更令人费解。

1 个答案:

答案 0 :(得分:6)

您的EOD;应该是该行上的所有内容。只有那4个字符。

你对第一个,第三个和第四个EOD;做得很好,但第二个EOD;在EOD背后有空白;选择代码(或以十六进制显示或显示空格的视图)以查看:

$message = <<<EOD
Hi Username
EOD;

echo $message.'<hr>';

if(true) {
    $message .= <<<EOD
Thanks for logging in
EOD;                    
} else {
    $message .= <<<EOD
Thanks for signing up.  
EOD;
}       

echo $message.'<hr>';   

$message .= <<<EOD
Good Bye                    
EOD;
echo $message;

图片澄清:

http://img803.imageshack.us/img803/826/whitespaceheredoc.png

这会导致第二个EOD和第三个EOD之间的所有内容被视为here-document:)

如果您使用过EOD1,EOD2,EOD3和EOD4,则会收到警告“未找到EOD2”或其他类似的警告。 您不是第一个遇到此错误的人,PHP HereDoc Manualpage甚至会显示警告(在heredoc endmarker之前有空格)。 hakre添加的内容确实是正确的,正如联机帮助页中所解释的那样:'可能'是一个分号。