开发和生产环境中经常会在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以后,不能使用”=&”符号,可以直接用”=”就可以了。 所以当出现这个问题后有两种解决方法:
- 把php的版本降级到5.3以下,但后退的不是明智的选择。
- 对程序中”=&”符号全部用”=” 代替。
示例如下: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. 新增动态访问静态方法的方式
如:
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. 命名空间支持常量和函数
|
|