错误抑制符去掉错误信息,eval和echo一样并不是函数,不能使用变量函数的方法调用比如:
$func = ‘eval’
$func()这样的调用就是无效的。它会提示没有eval函数,如果你自己定义这么一个函数也是有问题的。因为eval是一个关键字。
eval调用和include差不多,如果被包含文件中没有明确return就返回null。如果直接eval我们需要检查的文件会造成被检查的文件内代码被执行,这可不是我们想要的,我们只需要检查一下这个文件的语法是否正确。 我们可以在要检查的文件之前添加return 语句,让代码提前跳出,那么后面的代码就不会执行了。好的,就这么干。代码如下:
<ol class="dp-xml"> <li class="alt"><span class="tag"> ?PHP </span></li> <li> <span>if(!function_exists('</span>PHP<span>_check_syntax')) { </span> </li> <li class="alt"> <span>function </span>PHP<span>_check_syntax($file_name, <br>&$</span><span class="attribute">error_message</span><span> = </span><span class="attribute-value">null</span><span>) { </span> </li> <li> <span>$</span><span class="attribute">file_content</span><span> = </span><span class="attribute-value">file_get_contents</span><span>($file_name); </span> </li> <li class="alt"> <span>$</span><span class="attribute">check_code</span><span> = </span><span class="attribute-value">"return true; ?>"</span><span>; </span> </li> <li> <span>$</span><span class="attribute">file_content</span><span> = $check_code . <br>$file_content . "</span><span class="tag"><span> ?</span>PHP<span> "; </span></span> </li> <li class="alt"><span>if(!@eval($file_content)) { </span></li> <li> <span>$</span><span class="attribute">error_message</span><span> = </span><span class="attribute-value">"file: "</span><span> . <br>realpath($file_name) . " have syntax error"; </span> </li> <li class="alt"><span>return false; </span></li> <li><span>} </span></li> <li class="alt"><span>return true; </span></li> <li><span>} </span></li> <li class="alt"><span>} </span></li> <li> <span>if(!</span>PHP<span>_check_syntax("file.</span>PHP<span>", $msg)) { </span> </li> <li class="alt"><span>echo $msg; </span></li> <li><span>} </span></li> <li class="alt"><span>else { </span></li> <li><span>echo "Woohoo, OK!"; </span></li> <li class="alt"><span>} </span></li> <li><span class="tag"><span> ?</span>PHP<span> </span></span></li> <li class="alt"> <span>foreach:: </span><span class="attribute">a</span><span> =</span><span class="tag">></span><span> b </span> </li> <li> <span class="tag">?></span><span> </span> </li> </ol>
因为Parse error 是没法被 set_error_handler处理函数处理的。这个异常没办法catch到。所以才使用了@来抑制错误。这带来的问题就是我们无法得到详细的错误信息。 不过目前我需要的功能也只是检查语法是否正确。不正确的话重新编译模板文件,就这么简单,至于语法错误,在显示网页的时候自然会看得到。
PHP检查语法错误最好的办法就是这个被遗弃的PHP_check_syntax这个方法回到PHP中。下次再研究下他们是出于什么原因把这个函数去掉的。