Press "Enter" to skip to content

PHP7升级-新特性总结

数据类型

默认和严格模式

declare(strict_types=1);

开启后如果函数参数或者返回指定了数据类型,则开启校验,如果类型不匹配,则报FATAL ERROR.

类型说明

类型 描述 Minimum PHP version
Class 自定义类 PHP 5.0.0
interface 自定义接口 PHP 5.0.0
self 当前类 PHP 5.0.0
array 数组 PHP 5.0.0
object 对象类型(含自定义类) PHP 7.2.0
bool 布尔 PHP 7.0.0
float 浮点 PHP 7.0.0
int 整数 PHP 7.0.0
string 字符串 PHP 7.0.0
callable 函数类型 PHP 5.4.0
iterable 数组或者实现了Traversable接口的对象 PHP 7.1.0
?(以上类型) 可为空(Nullable)类型 PHP 7.1.0
void 空返回值类型 PHP 7.1.0

类型示例

function testReturn(): ?string
{
    return 'elePHPant';
}
var_dump(testReturn());
function testReturn(): ?string
{
    return null;
}
var_dump(testReturn());
function test(?string $name)
{
    var_dump($name);
}

类相关

允许重写抽象方法(7.2)

当一个抽象类继承于另外一个抽象类的时候,继承后的抽象类可以重写被继承的抽象类的抽象方法。

<?php
abstract class A
{
    abstract function test(string $s);
}
abstract class B extends A
{
    // overridden
    abstract function test($s) : int;
}

重写参数类型可省略(7.2)

<?php
interface A
{
    public function Test(array $input);
}
class B implements A
{
    public function Test($input){}
}

允许分组use命名空间

<?php
use Foo\Bar\{
    Foo,
    Bar,
    Baz,//最后一个可以逗号7.2才支持
};

类常量可见性(7.1)

支持设置类常量的可见性

<?php
class ConstDemo
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}

匿名类(7.0)

<?php
interface Logger {
    public function log(string $msg);
}
$app = new Application;
$app->setLogger(new class implements Logger {
    public function log(string $msg) {
        echo $msg;
    }
});

更便捷的语法

null合并运算符(7.0)

$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

太空船操作符(7.0)

<?php
// 整数
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// 浮点数
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
// 字符串
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1

…变长参数(PHP5.6)

function dosum(...$arr){
    $sum = 0;
    foreach($arr as $v){
        $sum += $v;
    }
    return $sum;
}
$arr = [1, 2, 3, 4, 5];
echo dosum(...$arr);   // 输出15
echo dosum(1,2,3,4,5,6); //输出21

[]定义数组

$arr = ['one', 'two', 'three'];

整数除法函数(7.0)

<?php
var_dump(intdiv(10, 3));

支持为负的字符串偏移量

现在所有支持偏移量的字符串操作函数 都支持接受负数作为偏移量,包括通过[]或{}操作字符串下标。在这种情况下,一个负数的偏移量会被理解为一个从字符串结尾开始的偏移量。

<?php
var_dump("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));

list

可以重点瞧一瞧

不向前兼容

Too few arguments exception(7.1)

function sayHello($name) {
    echo "Hello " . $name;
}
sayHello();
// Fatal error: Uncaught ArgumentCountError: Too few arguments to function sayHello(), 0 passed in...

foreach不再改变内部数组指针

<?php
$array = [0, 1, 2];
foreach ($array as &$val) {
    var_dump(current($array));
}
?>

Output of the above example in PHP 5:

int(1)
int(2)
bool(false)

Output of the above example in PHP 7:

int(0)
int(0)
int(0)

变量处理的变化

对变量、属性和方法的间接调用现在将严格遵循从左到右的顺序来解析

表达式 PHP 5 的解析方式 PHP 7 的解析方式
\$\$foo[’bar’][‘baz’] \${\$foo[’bar’][‘baz’]} (\$\$foo)[’bar’][‘baz’]
\$foo->\$bar[‘baz’] \$foo->{\$bar[‘baz’]} (\$foo->\$bar)[‘baz’]
\$foo->\$bar[’baz’]() \$foo->{\$bar[‘baz’]}() (\$foo->\$bar)[’baz’]()
Foo::\$bar[’baz’]() Foo::{\$bar[‘baz’]}() (Foo::\$bar)[’baz’]()

Be First to Comment

发表评论

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