PHP不同版本报错差异

开发和生产环境中经常会在PHP5.2、5.3和5.4版间切换,但各个版本函数和报错情况又不一样,下面发上工作中遇到报表不同后出现的各种坑。

PHP5.2升级后问题汇总

Deprecated: Assigning the return value of new by reference is deprecated in XXX

出现Deprecated: Assigning the return value of new by reference is deprecated in报错。这是因为5.3以后,不能使用”=&”符号,可以直接用”=”就可以了。 所以当出现这个问题后有两种解决方法:

  1. 把php的版本降级到5.3以下,但后退的不是明智的选择。
  2. 对程序中”=&”符号全部用”=” 代替。

示例如下:
Deprecated: Assigning the return value of new by reference is deprecated in

定位到出错的那一行: $this->_ole =& new OLERead();

我本地环境用的是PHP/5.3.8。

下面这段话引用于因思而变

解决办法:php5.3开始后,废除了php中的”=&”符号,所以要想复制,直接用=引用即可。详细如下:

1、PHP5对象复制是采用引用的方式;
2、如果不采用引用方式,则需要在复制对象时加关键字 clone;
3、如果在复制的过程中,同时要变更某些属性,则增加函数_clone();

PHP新增特性

自 PHP5.2 起,直至 PHP5.6 中增加的新特征。

  • PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束
  • PHP5.2:JSON 支持
  • PHP5.3:弃用的功能,匿名函数,
    新增魔术方法,命名空间,后期静态绑定,Heredoc 和 Nowdoc, const, 三元运算符,Phar
    
  • PHP5.4:Short Open Tag, 数组简写形式,Traits, 内置 Web 服务器,细节修改
  • PHP5.5:yield, list() 用于 foreach, 细节修改
  • PHP5.6: 常量增强,可变函数参数,命名空间增强

PHP5.2之前

1. autoload

php5.2 之前添加了__autoload()方法,使用一些类库的时候,难免会出现多个 autoload 函数的需要,于是 php5.4 后spl_autoload_register()取而代之了

PHP5.3

PHP5.4

1. Short Open Tag 自 PHP5.4 起总是可用

简写方式如<? /* Code... */ ?><?= $xxoo;?>.这种简写形式被称为 Short Open Tag, 在 PHP5.3 起被默认开启,在 PHP5.4 起总是可用。
使用这种简写形式在 HTML 中嵌入 PHP 变量将会非常方便。

2. 数组简写方式

简写形式如$arr = ["key" => "value", "key2" => "value2"];,在php5.4后开启支持

3. Traits

所谓Traits就是“构件”,是用来替代继承的一种机制。PHP中无法进行多重继承,但一个类可以包含多个Traits.

4. 内置 Web 服务器

支持写法: php -S localhost:8000

5. 新增动态访问静态方法的方式

如:

1
2
$func = "funcXXOO";
A::{$func}();

6. 新增在实例化时访问类成员的特征

(new MyClass)->xxoo();

7. 新增支持对函数返回数组的成员访问解析

这种写法在之前版本是会报错的:print func()[0];, php5.4开始支持

PHP5.5

1. yield关键字

php5.5新增yield关键字,用于当函数需要返回一个迭代器的时候, 逐个返回值。

2. list() 用于 foreach

可以用 list() 在 foreach 中解析嵌套的数组

3. 不推荐使用 mysql 函数,推荐使用 PDO 或 MySQLi

4. 可用 MyClass::class 取到一个类的完整限定名(包括命名空间)

5. empty() 支持表达式作为参数

6. try-catch 结构新增 finally 块。

PHP5.6

1. 定义常量时允许使用之前定义的常量进行计算

2. 可变函数参数

函数中使用$args代理之前的用于代替 func_get_args()

3. 命名空间支持常量和函数

1
2
3
4
5
6
7
8
9
10
namespace Name\Space {
const FOO = 42;
function f() { echo __FUNCTION__."\n"; }
}
namespace {
use const Name\Space\FOO;
use function Name\Space\f;
echo FOO."\n";
f();
}

PHP7.0

PHP7.1

PHP7.2