👁代表额外需要注意的,✅代表遇到过
5.3 Migrating 5.4
重点
break
和continue
不再接受可变参数(break 1 + max(x, y)
),break 0;continue 0
不允许出现- 现在参数名使用全局变量将会导致一个致命错误。禁止类似
function foo($_GET, $_POST) {}
这样的代码。 - 非数字的字符串偏移量👁
$a = '12345';
var_dump(isset($a['x']); // 5.3 true, 5.4 false
- 调用时的引用传递👁
function f(&$v){$v = true;}
f(&$v); // 5.3 no problem 5.4 PHP Fatal error
function f1($v){$v = true;}
f1(&$v); // 5.3 no problem 5.4 PHP Fatal error
function f2(&$v){$v = true;}
f2($v); // ok
一些不常用的
- 不支持安全模式
- 移除魔术引号
-
register_globals 和 register_long_arrays php.ini 指令被移除。
5.4 Migrating 5.5
重点
- 原始的 MySQL 扩展 现在被废弃,当连接到数据库时会产生一个 E_DEPRECATED 错误。👁
5.5 Migrating 5.6
重点
json_decode
严格模式cURL
文件上传 👁✅
> 必须先设置CURLOPT_SAFE_UPLOAD
为 FALSE 才能够使用@file
语法来上传文件。 建议使用 CURLFile 类来上传文件。- 使用
::
调用非静态方法,现在产生 E_DEPRECATED 错误 (以前是 E_STRICT) - 使用
always_populate_raw_post_data
会导致在填充$HTTP_RAW_POST_DATA
时产生E_DEPRECATED
错误。 请使用php://input
替代$HTTP_RAW_POST_DATA
, 因为它可能在后续的 PHP 版本中被移除。 在php.ini
中设置 always_populate_raw_post_data 为 -1 (这样会强制 $HTTP_RAW_POST_DATA 未定义,所以也不回导致 E_DEPRECATED 的错误) 👁✅ - 使用数组标识符为类定义数组类型的属性时,数组的键不会被覆盖
class C {
const ONE = 1;
public $array = [
self::ONE => 'foo',
'bar',
'quux',
];
}
var_dump((new C)->array);
/* 5.5 before array(2) {
[0]=>
string(3) "bar"
[1]=>
string(4) "quux"
}
*
* 5.6
* array(3) {
[1]=>
string(3) "foo"
[2]=>
string(3) "bar"
[3]=>
string(4) "quux"
}
*/
其他问题
-
线上的php5.6没有编译
fileinfo
,这个会导致读不到文件信息,因为运维都是统一安装的,所以最好看一下是否enable-fileinfo
-
启用 Opcache,之前因为出现了一些问题,运维那边关掉这个缓存,最好和运维沟通,并测试缓存是否正确使用、正常更新。