<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >错误报告</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REL="HOME" TITLE="PHP 手册" HREF="index.html"><LINK REL="UP" TITLE="从 PHP 3 移植到 PHP 4" HREF="migration4.html"><LINK REL="PREVIOUS" TITLE="解析器行为" HREF="migration4.parser.html"><LINK REL="NEXT" TITLE="初始化" HREF="migration4.initializers.html"><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"></HEAD ><BODY CLASS="section" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >PHP 手册</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="migration4.parser.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" >附录 D. 从 PHP 3 移植到 PHP 4</TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="migration4.initializers.html" ACCESSKEY="N" >下一页</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="section" ><H1 CLASS="section" ><A NAME="migration4.error-reporting" >错误报告</A ></H1 ><DIV CLASS="section" ><H2 CLASS="section" ><A NAME="migration4.error-reporting.config" >配置的改变</A ></H2 ><P > PHP 3 错误报告的级别是简单的将不同的错误报告级别的数字相加而成。通常 15 代表报告所有错误,而 7 代表报告除了 notice 信息以外的所有错误。 </P ><P > PHP 4 有一整套错误和警告的级别,并且配置解析器允许使用符号常量来定义显示的错误级别。 </P ><P > 错误报告级别应该被明确的配置。如果不想显示某种错误信息,需要将他们从 <TT CLASS="literal" >E_ALL</TT > 符号常量中排除。听起来很复杂吗?让我们看看吧。如果想显示除了以 <TT CLASS="literal" >E_NOTICE</TT > 表示的 notice 信息以外的所有错误信息,就应该在 <TT CLASS="filename" >php.ini</TT > 中设置:<TT CLASS="literal" >error_reporting = E_ALL & ~ ( E_NOTICE )</TT > 。如果还不想显示 warning 信息,只需要使用“|”运算符:<TT CLASS="literal" >error_reporting= E_ALL & ~ ( E_NOTICE | E_WARNING )</TT >。 </P ><DIV CLASS="warning" ><P ></P ><TABLE CLASS="warning" BORDER="1" WIDTH="100%" ><TR ><TD ALIGN="CENTER" ><B >警告</B ></TD ></TR ><TR ><TD ALIGN="LEFT" ><P > 当把代码从 PHP 3 升级到 PHP 4 时,需要检查这些设置,并调用 <A HREF="function.error-reporting.html" ><B CLASS="function" >error_reporting()</B ></A > 函数,否则可能会屏蔽一些新的错误报告类型,特别是 E_COMPILE_ERROR。这可能将导致没有任何反馈信息的空白页,使得用户不知道发生了什么,也不知道问题所在。 </P ></TD ></TR ></TABLE ></DIV ><DIV CLASS="warning" ><P ></P ><TABLE CLASS="warning" BORDER="1" WIDTH="100%" ><TR ><TD ALIGN="CENTER" ><B >警告</B ></TD ></TR ><TR ><TD ALIGN="LEFT" ><P > 使用旧有的从 7 到 15 的数字来设置错误报告的级别不是个好主意,因为这屏蔽了 PHP 4 中新的错误类产生的错误信息。这可能导致非常奇怪的现象:脚本不能执行却没有任何错误提示。 </P ><P > 这在过去已经导致了许多重复的 bug 报告。人们报告新的脚本引擎不能跟踪脚本文件中经常发生的缺少“}”的错误。事实上,这是由不正确的配置引起的。 </P ><P > 所以,检查错误报告的设置是在脚本无法运行而没有出现错误提示时应做的第一件事。Zend engine 到现在已经很成熟了,一般不会出现如此奇怪的现象。 </P ></TD ></TR ></TABLE ></DIV ></DIV ><DIV CLASS="section" ><H2 CLASS="section" ><A NAME="migration4.error-reporting.additions" >额外的警告信息</A ></H2 ><P > 许多已存在的 PHP 3 代码使用的语言样式在现在应当被看做是非常糟糕的。因此,如果用 PHP 4 编译该脚本,会产生很多额外的警告信息。如果不想看到这些信息,只要简单的把 E_NOTICE 选项关闭。但更好的做法是修正代码。 </P ><P > 最常见的出现 notice 提示信息的情况是在数组索引中使用没有加引号的字符串。PHP 3 和 PHP 4 在没有同名的常量定义时都会把它解释为字符串,但是无论何时只要有常量是以该字符串命名,脚本就可能会出现错误。如果有黑客利用这一点,设法重定义该常量,这个脚本就存在安全漏洞。所以只要出现未加引号的索引,PHP 4 就会警告对它加以修正。举例来说,有漏洞的代码 <TT CLASS="literal" >$_SERVER[REQUEST_METHOD]</TT >,只要将它改为 <TT CLASS="literal" >$_SERVER['REQUEST_METHOD']</TT >,错误提示就会消失。 </P ><P > PHP 4 还会对未初始化的变量或数组元素加以提示。 </P ></DIV ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="migration4.parser.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >起始页</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="migration4.initializers.html" ACCESSKEY="N" >下一页</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >解析器行为</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="migration4.html" ACCESSKEY="U" >上一级</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >初始化</TD ></TR ></TABLE ></DIV ></BODY ></HTML >