未向下兼容的改变

尽管大部分 PHP 4 的代码应该不用修改就能运行,还是应该留意以下不向下兼容的改变:

  • 有了一些新关键字。
  • strrpos()和 strripos()如今使用整个字符串作为 needle。
  • 非法使用字符串偏移量会导致 e_error 而不是 e_warning。一个非法使用的例子:$str = 'abc'; unset($str[0]);.
  • array_merge()被改成只接受数组。如果传递入非数组变量,对每个此类参数都会发出一条 e_warning 信息。要小心因为你的代码有可能疯狂发出 e_warning。
  • path_translated 服务器变量在 apache2 sapi 中不再暗中设定,这和 php 4 中的情形相反,如果 apache 没产生此值则其被设为和 script_filename 服务器变量一样的值。此修改是为了遵守 » cgi 规范。更多信息见 » bug #23610,并参考手册中 $_server['path_translated'] 的说明。此问题也影响到 php >= 4.3.2 的版本。
  • tokenizer 扩展不再定义 t_ml_comment 常量。如果把 error_reporting 设为 e_all,php 将产生一条消息。尽管 t_ml_comment 从来都没用到过,还是在 php 4 中定义了。在 php 4 和 php 5 中 // 和 都被解析为 t_comment 常量。但是 phpdoc 风格的注释 ,自 php 5 开始被 php 解析,被识别为 t_doc_comment。
  • 如果 variables_order 包括"s",$_server 应该带有 argc 和 argv 被产生。如果用户特别配制系统不创建 $_server,那此变量当然就不存在了。改变的地方是不管 variables_order 怎么设定,在 cli 版本中 argc 和 argv 总是可用的。本来 cli 版不是总会产生全局变量 $argc 和 $argv 的。
  • 没有属性的对象不再被当成"empty"。
  • 有些情况下类必须在使用前被定义。这仅在使用了一些 php 5 的新特性(例如 interfaces)的时候发生。其它情况下行为都没变。
  • get_class(),get_parent_class()和 get_class_methods()如今返回的类/方法名和定义时的名字一致(区分大小写),对于依赖以前行为(类/方法名总是返回小写的)的老脚本可能产生问题。一个可能的解决方法是在脚本中搜索所有这些函数并使用 strtolower()。 区分大小写的改变也适用于魔术常量 __class__,__method__ 和 __function__。其值都会严格按照定义时的名字返回(区分大小写)。
  • ip2long()在传递入一个非法 ip 作为参数时返回 false,不再是 -1。
  • 如果有函数定义在包含文件中,则这些函数可以在主文件中使用而与是否在 return 指令之前还是之后无关。如果文件被包含两次,php 5 会发出致命错误,因为函数已经被定义,而 php 4 不管这个。因此推荐使用 include_once 而不要去检查文件是否已被包含以及在包含文件中有条件返回。
  • include_once 和 require_once 在 windows 下先将路径规格化,因此包含 a.php 和 a.php 只会把文件包含一次。

淘宝 adsense 商品推荐

官方正版 Google AdSense实战宝典 用谷歌广告联盟出海赚美元 第2版 祁劲松 网站运营书籍 seo搜索引擎优化 AdSense从入门到精通

价格:37元

Example #1strrpos()strripos()如今用整个字符串作为 needle

<?php
var_dump(strrpos('ABCDEF','DEF')); //int(3)

var_dump(strrpos('ABCDEF','DAF')); //bool(false)
?>

Example #2 没有属性的对象不再被当成"empty"

<?php
class test { }
$t = new test();

var_dump(empty($t)); // echo bool(false)

if ($t) {
    // Will be executed
}
?>

Example #3 有些情况下类必须在使用之前定义

<?php

//works with no errors:
$a = new a();
class a {
}


//throws an error:
$a = new b();

interface c{
}
class b implements c {
}

?>