<!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/FI 2 移植到 PHP 3" HREF="migration.html"><LINK REL="PREVIOUS" TITLE="while 语法" HREF="migration.while.html"><LINK REL="NEXT" TITLE="错误消息已经改变" HREF="migration.errors.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="migration.while.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" >附录 E. 从 PHP/FI 2 移植到 PHP 3</TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="migration.errors.html" ACCESSKEY="N" >下一页</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="section" ><H1 CLASS="section" ><A NAME="migration.expr" >表达式类型</A ></H1 ><P > PHP/FI 2.0 根据表达式左边判断表达式的类型,而 PHP 3.0 则根据表达式两边进行判断。这便可能导致 2.0 下运行正常的脚本在 3.0 下导致异常。 </P ><P > 考虑以下例子: <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN290780" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> $a[0]=5;<br />$a[1]=7;<br /><br />$key = key($a);<br />while ("" != $key) {<br /> echo "$keyn";<br /> next($a);<br />}</font> </code></TD ></TR ></TABLE ><P ></P ></DIV > 在 PHP/FI 2.0 中,这段程序将显示所有 $a 的索引,而在 PHP 3.0 中,这个程序什么都不会现实。原因是,在 PHP 2.0 中,因为左边参数的类型是 string,于是,一个 string 的关系便建立起来。当然 <TT CLASS="literal" >""</TT > 并不等于 <TT CLASS="literal" >"0"</TT >,循环从头到尾。而在 PHP 3.0 中,当一个 string 和一个 integer 比较时,将 string 转换为 integer 并比较。结果是比较值为 <TT CLASS="literal" >0</TT > 的 <TT CLASS="literal" >atoi("")</TT >,和同样是值为 <TT CLASS="literal" >0</TT > 的 <TT CLASS="literal" >variablelist</TT >,也就是 <TT CLASS="literal" >0==0</TT >。所以循环根本没有执行。 </P ><P > 很容易修正它。把 while 声明替换为: <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN290790" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> while ((string)$key != "") {</font> </code></TD ></TR ></TABLE ><P ></P ></DIV > </P ></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="migration.while.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="migration.errors.html" ACCESSKEY="N" >下一页</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >while 语法</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="migration.html" ACCESSKEY="U" >上一级</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >错误消息已经改变</TD ></TR ></TABLE ></DIV ></BODY ></HTML >