php7.2 不向后兼容的改动

做一个简单的总结,没有涵盖全部改动,因为不常见。

1. number_format()不会返回-0

因为-0这种写法很古怪,所以number_format(-0.01),会返回0。


2. 对数组强制转成对象时,会将整形key转成string

直接看代码,

$a = [0 => 1]; $a = (object)$a; print_r($a->{0}); //或者 print_r($a->{'0'});

现在允许这么写。但是key已经变成string类型,即’0’。


3. 不可以对不能count的对象调用count函数

没有实现Countable接口的对象都不能调用count函数,比如 count(1),count(‘a’) 在之前都会返回1,但是在7.2版本以后,会返回一个E_WARNING级别的错误,看一个例子:

class _count implements Countable{
    public function count() {
        return 10;
    }
}

$count = new _count();
echo count($count);  // 10

 


4. 可以对__PHP_Incomplete_Class类型的对象调用is_object方法

__PHP_Incomplete_Class,这个东西就是有一个对象,php没有找到定义它的地方,就会把该对象的类型变成这个,举个例子:

$serialized_object='O:1:"a":1:{s:5:"value";s:3:"100";}';

print_r( unserialize($serialized_object) );

// __PHP_Incomplete_Class Object ( [__PHP_Incomplete_Class_Name] => a [value] => 100 )

在解序列化的时候很常见,可以用unserialize_callback_func选项去避免,举个例子:

$serialized_object='O:1:"a":1:{s:5:"value";s:3:"100";}';

ini_set('unserialize_callback_func', 'mycallback'); // 设置回调

print_r( unserialize($serialized_object) );
function mycallback($classname) 
{
    require_once $classname.".php";
}

而在7,2版本对__PHP_Incomplete_Class对象调用is_object(),会返回true。


5. 使用一个未定义的常量,会产生一个E_WARNING级别的错误。

echo NAME;
// Warning: Use of undefined constant NAME

6. bcmod函数对于浮点数的操作

在之前,bcmod对于浮点数的运算类似于%操作符,但是在新版类似于fmod。

echo bcmod(4,3.5);  // 之前会返回1,现在会返回1,5

 

Leave a comment

电子邮件地址不会被公开。 必填项已用*标注