php引擎能否向下兼容,未向下兼容的改变 - PHP 7 中文文档

未向下兼容的改变

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

有了一些[新关键字](php7/reserved.keywords)。

[strrpos()](php7/function.strrpos) 和 [strripos()](php7/function.strripos)

如今使用整个字符串作为 needle。

非法使用字符串偏移量会导致 E_ERROR 而不是

E_WARNING。一个非法使用的例子:$str = 'abc'; unset($str[0]);.

[array_merge()](php7/function.array-merge) 被改成只接受数组。如果传递入非数组变量,对每个此类参数都会发出一条

E_WARNING 信息。要小心因为你的代码有可能疯狂发出

E_WARNING。

PATH_TRANSLATED 服务器变量在 Apache2 SAPI 中不再暗中设定,这和 PHP 4

中的情形相反,如果 Apache 没产生此值则其被设为和

SCRIPT_FILENAME 服务器变量一样的值。此修改是为了遵守

» CGI 规范。更多信息见 » bug #23610,并参考手册中

[$_SERVER['PATH_TRANSLATED']](php7/reserved.variables.server)

的说明。此问题也影响到 PHP >= 4.3.2 的版本。

[Tokenizer](php7/ref.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](php7/ini.core)

包括“S”,$_SERVER 应该带有 argc 和 argv 被产生。如果用户特别配制系统不创建

$_SERVER,那此变量当然就不存在了。改变的地方是不管 [variables_order](php7/ini.core) 怎么设定,在

CLI 版本中 argc 和 argv 总是可用的。本来 CLI

版不是总会产生全局变量 $argc 和 $argv 的。

没有属性的对象不再被当成“empty”。

有些情况下类必须在使用前被定义。这仅在使用了一些 PHP 5

的新特性(例如 [interfaces](php7/language.oop5.interfaces))的时候发生。其它情况下行为都没变。

[get_class()](php7/function.get-class),[get_parent_class()](php7/function.get-parent-class)

和 [get_class_methods()](php7/function.get-class-methods)

如今返回的类/方法名和定义时的名字一致(区分大小写),对于依赖以前行为(类/方法名总是返回小写的)的老脚本可能产生问题。一个可能的解决方法是在脚本中搜索所有这些函数并使用

[strtolower()](php7/function.strtolower)。

区分大小写的改变也适用于[魔术常量](php7/language.constants.predefined)

__CLASS__,__METHOD__

和 __FUNCTION__。其值都会严格按照定义时的名字返回(区分大小写)。

[ip2long()](php7/function.ip2long) 在传递入一个非法

IP 作为参数时返回 FALSE,不再是

-1。

如果有函数定义在包含文件中,则这些函数可以在主文件中使用而与是否在

[return](php7/function.return) 指令之前还是之后无关。如果文件被包含两次,PHP 5

会发出致命错误,因为函数已经被定义,而 PHP 4

不管这个。因此推荐使用 [include_once](php7/function.include-once)

而不要去检查文件是否已被包含以及在包含文件中有条件返回。

[include_once](php7/function.include-once) 和 [require_once](php7/function.require-once)

在 Windows 下先将路径规格化,因此包含

A.php 和 a.php 只会把文件包含一次。

Example #1

[strrpos()](php7/function.strrpos) 和 [strripos()](php7/function.strripos)

如今用整个字符串作为 needle

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

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

?>

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

class test { }

$t = new test();

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

if ($t) {

// Will be executed

}

?>

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

//works with no errors:

$a = new a();

class a {

}

//throws an error:

$a = new b();

interface c{

}

class b implements c {

}

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值