php eval()中使用heredoc的unexpected $end錯誤

php的Heredoc很好用,無論是在一般的義大利麵式的程式,或在MVC中的view。善用他,可以讓php code和html做較好的分割,讓維護比較容易。也不會破壞原本html排版。

最近,因個特殊案例,使用Heredoc配合eval(),卻遇到了問題。狀況如下…

首先,使用『'』配合eval(),一切正常。如下…
  1. $php='Hypertext Preprocessor';  
  2. $str='PHP is {$php}';  
  3. eval("\$newstr=\"$str\" ;");  
  4. echo $newstr;  
  5. //print : PHP is Hypertext Preprocessor  
但是,當我想在$str這字串中,放入『"』時
  1. $php='Hypertext Preprocessor';  
  2. $str='"PHP" is {$php}';  //用"會導致錯誤  
  3. eval("\$newstr=\"$str\" ;");  
  4. echo $newstr;  
卻得到如下錯誤訊息。原因?這是因為$str中的『"』破壞eval()的字串
PHP Parse error: syntax error, unexpected T_STRING in /export/test.php(4) : eval()'d code on line 1
Parse error: syntax error, unexpected T_STRING in /export/test.php(4) : eval()'d code on line 1
PHP Notice: Undefined variable: newstr in /export/test.php on line 5

利用Heredoc,就不會受到『"』的影響。
  1. $php='Hypertext Preprocessor';  
  2. $str='"PHP" is {$php}';  
  3. eval("\$newstr =<<<EOD\n$str \nEOD;");  
  4. echo $newstr;  
  5. //print : "PHP" is Hypertext Preprocessor  
不過,卻會得到『unexpected $end』的錯誤訊息。查了一下PHP文件,似乎和缺少<?php 及 ?>  有關。但…以我的應用,應該不是這個問題…
PHP Parse error: syntax error, unexpected $end in /export/test.php(4) : eval()'d code on line 3
Parse error: syntax error, unexpected $end in /export/test.php(4) : eval()'d code on line 3
PHP Notice: Undefined variable: newstr in /export/test.php on line 5

查了很久,看過不少解決方式…最後確認的解決之道……只是,最後多增加一個斷行(\n)即可
  1. eval("\$newstr =<<<EOD\n$str \nEOD;\n"); //多一個斷行即可解決  

留言