php8新特性

时间:2020-11-27

注:对象调用的方法右箭头被编辑器去掉了,以后修改这个bug!

命名参数

如果函数的参数定义了默认值,则可以使用命名参数调用,不需要调用的默认值参数可以直接忽略。

function add($a, $b = 1, $c = 2)
{
    return $a + $b + $c;
}

echo add(1);
echo 'br';
echo add(1, c:10);
echo 'br';
echo add(1, c:10,b:100);

注解

class My
{
    #[Route("/api/posts/{id}", methods: ["GET"])]
    /**
     * 这是注释
     */
    public function test()
    {
        echo 'test';
    }
}

$my = new My();
$my-test();

可以做路由用了,估计一大批框架即将实现此功能!

构造函数属性提升

class My
{
    public function __construct(public float $age,public string $name = '')
    {

    }

    public function test():string
    {
        echo $this-name.'---'.$this-age;
    }
}

$my = new My(122,'张三');
$my-test();

联合类型

function getAge(int|string $age): int|string
{
    return $age;
}

var_dump(getAge(1));
echo 'br';
var_dump(getAge('1'));
echo 'br';
var_dump(getAge(false));
echo 'br';
var_dump(getAge(1.222));

match表达式

echo match(1){
    1 = 'xxxxxxxx',
    2 = 'yyyyyyyy'
};

空安全运算符

$country = $session?-user?-getAddress()?-country;
var_dump($country);

更合理的字符串与数字比较

var_dump(0 == 'foobar');
var_dump(0 == '0foobar');
var_dump(0 == '');
var_dump(0 == null);
var_dump(0 == false);

当然这个结果肯定为true

var_dump(0 == '0');

内部函数的一致类型错误

strlen([]);

??=

变量不存在使用后面的值代替

$b = $a ??= '1';
var_dump($b);

弱映射

$map = new WeakMap();

class A{
    public function test(){
        echo 'test';
    }
}
$a = new A();
$map[$a] =  'a';

var_dump($map);

参考链接:https://php.watch/versions/8.0/weakmap

静态绑定

class Test {
    public function create(): static {
        return new static();
    }
}

$a = new Test();
var_dump($a-create());
var_dump($a-create());
var_dump($a-create());
var_dump($a-create());


var_dump(new Test());
var_dump(new Test());
var_dump(new Test());
var_dump(new Test());

参考链接

https://www.php.net/manual/zh/migration80.new-features.php

https://www.php.net/releases/8.0/en.php