Sophie

Sophie

distrib > Mandriva > 2008.1 > x86_64 > by-pkgid > 05cd670d8a02b2b4a0ffb1756f2e8308 > files > 10767

php-manual-zh-5.2.4-1mdv2008.1.noarch.rpm

<!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 4 移植到 PHP 5"
HREF="migration5.html"><LINK
REL="PREVIOUS"
TITLE="从 PHP 4 移植到 PHP 5"
HREF="migration5.html"><LINK
REL="NEXT"
TITLE="CLI 和 CGI"
HREF="migration5.cli-cgi.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="migration5.html"
ACCESSKEY="P"
>上一页</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>附录 C. 从 PHP 4 移植到 PHP 5</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="migration5.cli-cgi.html"
ACCESSKEY="N"
>下一页</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="section"
><H1
CLASS="section"
><A
NAME="migration5.incompatible"
>未向下兼容的改变</A
></H1
><P
>&#13;    尽管大部分 PHP 4 的代码应该不用修改就能运行,还是应该留意以下不向下兼容的改变:
   </P
><P
></P
><UL
><LI
><P
>&#13;      有了一些<A
HREF="reserved.html#reserved.keywords"
>新关键字</A
>。
     </P
></LI
><LI
><P
>&#13;      <A
HREF="function.strrpos.html"
><B
CLASS="function"
>strrpos()</B
></A
> 和 <A
HREF="function.strripos.html"
><B
CLASS="function"
>strripos()</B
></A
>
      如今使用整个字符串作为 needle。
     </P
></LI
><LI
><P
>&#13;      非法使用字符串偏移量会导致 <TT
CLASS="constant"
><B
>E_ERROR</B
></TT
> 而不是
      <TT
CLASS="constant"
><B
>E_WARNING</B
></TT
>。一个非法使用的例子:<TT
CLASS="literal"
>$str = 'abc'; unset($str[0]);</TT
>.
     </P
></LI
><LI
><P
>&#13;      <A
HREF="function.array-merge.html"
><B
CLASS="function"
>array_merge()</B
></A
> 被改成只接受数组。如果传递入非数组变量,对每个此类参数都会发出一条
      <TT
CLASS="constant"
><B
>E_WARNING</B
></TT
> 信息。要小心因为你的代码有可能疯狂发出
      <TT
CLASS="constant"
><B
>E_WARNING</B
></TT
>。
     </P
></LI
><LI
><P
>&#13;      PATH_TRANSLATED 服务器变量在 Apache2 SAPI 中不再暗中设定,这和 PHP 4
      中的情形相反,如果 Apache 没产生此值则其被设为和
      SCRIPT_FILENAME 服务器变量一样的值。此修改是为了遵守
      <A
HREF="http://hoohoo.ncsa.uiuc.edu/cgi/"
TARGET="_top"
>CGI 规范</A
>。更多信息见 <A
HREF="http://bugs.php.net/23610"
TARGET="_top"
>bug #23610</A
>,并参考手册中
      <A
HREF="reserved.variables.html#reserved.variables.server"
>$_SERVER['PATH_TRANSLATED']</A
>
      的说明。此问题也影响到 PHP &#62;= 4.3.2 的版本。
     </P
></LI
><LI
><P
>&#13;      <A
HREF="ref.tokenizer.html"
>Tokenizer</A
> 扩展不再定义
      <TT
CLASS="constant"
><B
>T_ML_COMMENT</B
></TT
> 常量。如果把
      error_reporting 设为 <TT
CLASS="constant"
><B
>E_ALL</B
></TT
>,PHP
      将产生一条消息。尽管 <TT
CLASS="constant"
><B
>T_ML_COMMENT</B
></TT
>
      从来都没用到过,还是在 PHP 4 中定义了。在 PHP 4 和 PHP 5
      中 // 和 /* */ 都被解析为 <TT
CLASS="constant"
><B
>T_COMMENT</B
></TT
>
      常量。但是 PHPDoc 风格的注释 /** */,自 PHP 5 开始被
      PHP 解析,被识别为 <TT
CLASS="constant"
><B
>T_DOC_COMMENT</B
></TT
>。
     </P
></LI
><LI
><P
>&#13;      如果 <A
HREF="ini.core.html#ini.variables-order"
>variables_order</A
>
      包括“S”,$_SERVER 应该带有 argc 和 argv 被产生。如果用户特别配制系统不创建
      $_SERVER,那此变量当然就不存在了。改变的地方是不管 <A
HREF="ini.core.html#ini.variables-order"
>variables_order</A
> 怎么设定,在
      CLI 版本中 argc 和 argv 总是可用的。本来 CLI
      版不是总会产生全局变量 $argc 和 $argv 的。
     </P
></LI
><LI
><P
>&#13;      没有属性的对象不再被当成“empty”。
     </P
></LI
><LI
><P
>&#13;      有些情况下类必须在使用前被定义。这仅在使用了一些 PHP 5
      的新特性(例如 <A
HREF="language.oop5.interfaces.html"
>interfaces</A
>)的时候发生。其它情况下行为都没变。
     </P
></LI
><LI
><P
>&#13;      <A
HREF="function.get-class.html"
><B
CLASS="function"
>get_class()</B
></A
>,<A
HREF="function.get-parent-class.html"
><B
CLASS="function"
>get_parent_class()</B
></A
>
      和 <A
HREF="function.get-class-methods.html"
><B
CLASS="function"
>get_class_methods()</B
></A
>
      如今返回的类/方法名和定义时的名字一致(区分大小写),对于依赖以前行为(类/方法名总是返回小写的)的老脚本可能产生问题。一个可能的解决方法是在脚本中搜索所有这些函数并使用
      <A
HREF="function.strtolower.html"
><B
CLASS="function"
>strtolower()</B
></A
>。
     </P
><P
>&#13;      区分大小写的改变也适用于<A
HREF="language.constants.predefined.html"
>魔术常量</A
>
      <TT
CLASS="constant"
><B
>__CLASS__</B
></TT
>,<TT
CLASS="constant"
><B
>__METHOD__</B
></TT
>
      和 <TT
CLASS="constant"
><B
>__FUNCTION__</B
></TT
>。其值都会严格按照定义时的名字返回(区分大小写)。
     </P
></LI
><LI
><P
>&#13;      <A
HREF="function.ip2long.html"
><B
CLASS="function"
>ip2long()</B
></A
> 在传递入一个非法
      IP 作为参数时返回 <TT
CLASS="constant"
><B
>FALSE</B
></TT
>,不再是
      <TT
CLASS="literal"
>-1</TT
>。
     </P
></LI
><LI
><P
>&#13;      如果有函数定义在包含文件中,则这些函数可以在主文件中使用而与是否在
      <A
HREF="function.return.html"
><B
CLASS="function"
>return()</B
></A
> 指令之前还是之后无关。如果文件被包含两次,PHP 5
      会发出致命错误,因为函数已经被定义,而 PHP 4
      不管这个。因此推荐使用 <A
HREF="function.include-once.html"
><B
CLASS="function"
>include_once()</B
></A
>
      而不要去检查文件是否已被包含以及在包含文件中有条件返回。
     </P
></LI
><LI
><P
>&#13;      <A
HREF="function.include-once.html"
><B
CLASS="function"
>include_once()</B
></A
> 和 <A
HREF="function.require-once.html"
><B
CLASS="function"
>require_once()</B
></A
>
      在 Windows 下先将路径规格化,因此包含
      A.php 和 a.php 只会把文件包含一次。
     </P
></LI
></UL
><P
>&#13;    <TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
CLASS="EXAMPLE"
><TR
><TD
><DIV
CLASS="example"
><A
NAME="AEN290197"
></A
><P
><B
>例 C-1. 
      <A
HREF="function.strrpos.html"
><B
CLASS="function"
>strrpos()</B
></A
> 和 <A
HREF="function.strripos.html"
><B
CLASS="function"
>strripos()</B
></A
>
      如今用整个字符串作为 needle
     </B
></P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
CELLPADDING="5"
><TR
><TD
><code><font color="#000000">
<font color="#0000BB">&lt;?php<br />var_dump</font><font color="#007700">(</font><font color="#0000BB">strrpos</font><font color="#007700">(</font><font color="#DD0000">'ABCDEF'</font><font color="#007700">,</font><font color="#DD0000">'DEF'</font><font color="#007700">)); </font><font color="#FF8000">//int(3)<br /><br /></font><font color="#0000BB">var_dump</font><font color="#007700">(</font><font color="#0000BB">strrpos</font><font color="#007700">(</font><font color="#DD0000">'ABCDEF'</font><font color="#007700">,</font><font color="#DD0000">'DAF'</font><font color="#007700">)); </font><font color="#FF8000">//bool(false)<br /></font><font color="#0000BB">?&gt;</font>
</font>
</code></TD
></TR
></TABLE
></DIV
></TD
></TR
></TABLE
>
   </P
><P
>&#13;    <TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
CLASS="EXAMPLE"
><TR
><TD
><DIV
CLASS="example"
><A
NAME="AEN290203"
></A
><P
><B
>例 C-2. 没有属性的对象不再被当成“empty”</B
></P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
CELLPADDING="5"
><TR
><TD
><code><font color="#000000">
<font color="#0000BB">&lt;?php<br /></font><font color="#007700">class </font><font color="#0000BB">test </font><font color="#007700">{ }<br /></font><font color="#0000BB">$t </font><font color="#007700">= new </font><font color="#0000BB">test</font><font color="#007700">();<br /><br /></font><font color="#0000BB">var_dump</font><font color="#007700">(empty(</font><font color="#0000BB">$t</font><font color="#007700">)); </font><font color="#FF8000">// echo bool(false)<br /><br /></font><font color="#007700">if (</font><font color="#0000BB">$t</font><font color="#007700">) {<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#FF8000">// Will be executed<br /></font><font color="#007700">}<br /></font><font color="#0000BB">?&gt;</font>
</font>
</code></TD
></TR
></TABLE
></DIV
></TD
></TR
></TABLE
>
   </P
><P
>&#13;    <TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
CLASS="EXAMPLE"
><TR
><TD
><DIV
CLASS="example"
><A
NAME="AEN290207"
></A
><P
><B
>例 C-3. 有些情况下类必须在使用之前定义</B
></P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
CELLPADDING="5"
><TR
><TD
><code><font color="#000000">
<font color="#0000BB">&lt;?php<br /><br /></font><font color="#FF8000">//works with no errors:<br /></font><font color="#0000BB">$a </font><font color="#007700">= new </font><font color="#0000BB">a</font><font color="#007700">();<br />class </font><font color="#0000BB">a </font><font color="#007700">{<br />}<br /><br /><br /></font><font color="#FF8000">//throws an error:<br /></font><font color="#0000BB">$a </font><font color="#007700">= new </font><font color="#0000BB">b</font><font color="#007700">();<br /><br /></font><font color="#0000BB">interface c</font><font color="#007700">{<br />}<br />class </font><font color="#0000BB">b implements c </font><font color="#007700">{<br />}<br /><br /></font><font color="#0000BB">?&gt;</font>
</font>
</code></TD
></TR
></TABLE
></DIV
></TD
></TR
></TABLE
>
   </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="migration5.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="migration5.cli-cgi.html"
ACCESSKEY="N"
>下一页</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>从 PHP 4 移植到 PHP 5</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="migration5.html"
ACCESSKEY="U"
>上一级</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>CLI 和 CGI</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>