当前位置: 首页 > 后端技术 > PHP

【精选】PHP8引入了一些重大变化,有哪些新特性和性能优化?

时间:2023-03-29 17:55:14 PHP

让我们来看看php8引入的主要变化,以及许多新特性和性能优化。新增ValueError异常这是8新引入的ValueError内置异常类,继承自Exception基类。每次你传递一个值给一个函数,如果它检测到它是一个无效的类型,抛出这个异常。在PHP8之前,这样的操作会直接作为警告处理。示例代码:number=$number;}publicfunctiongetNumber():int|float{return$this->number;}}/***我们可以将浮点数和整数值传递给Number对象*/$number=newNumber();$number->setNumber(5);var_dump($number->getNumber());$number->setNumber(11.54);var_dump($number->getNumber());退出;:重写方法时允许使用可变参数在子类中重写父类方法时,可以将任意数量的参数替换为可变参数,只要兼容相应的参数类型即可。示例代码如下method('i可以被覆盖!');exit;运行结果:static关键字可以用来标识static返回类型8中的一个方法,返回该方法当前所属的类,即使是继承的,也可以用于后期静态绑定。示例代码如下:cache=newWeakMap();}publicfunctiongetSomethingWithCaching(object$obj){return$this->cache[$obj]??=$this->computeSomethingExpensive($obj);}publicfunctioncomputeSomethingExpensive(object$obj){var_dump("Igotcalled");返回兰特(1,100);}}$cacheObject=newstdClass;$obj=newFooBar;//"Igotcalled"只会打印一次$obj->getSomethingWithCaching($cacheObject);$obj->getSomethingWithCaching($cacheObject);var_dump(count($obj->cache));//删除对象后,WeakMap会释放对应的内存unset($cacheObject);var_dump(count($obj->cache));exit;对应运行结果:变量语法调整8newandinstanceofkey支持任意表达式,示例代码如下thrownewException();$nullableValue=null;//$value非空$value=$nullableValue??抛出新的InvalidArgumentException();退出;捕获异常而不将它们存储在变量中8可以编写catch(Exception)代码来捕获异常,但不需要将它们存储在变量中:middleware=$middleware;}}//下面的语法会将上面的注解添加到MyController类中,并将auth作为参数传入#[ApplyMiddleware('auth')]classMyController{publicfunctionindex(){}}//然后我们就可以使用类中的反射以获取所有ApplyMiddleware注释并读取给定的中间件参数$reflectionClass=newReflectionClass(MyController::class);$attributes=$reflectionClass->getAttributes(ApplyMiddleware::class);foreach($attributesas$attribute){$middlewareAttribute=$attribute->newInstance();var_dump($middlewareAttribute->middleware);}exit;运行上面的代码,打印结果:8个新的构造函数属性提示支持这个新特性是支持属性声明和构造函数属性初始化相结合的语法速记。示例代码如下:id);var_dump($user->name);exit;以上代码运行结果:php8的Trait支持定义抽象私有方法,示例代码如下:neededByTheTrait());}}classTraitUser{使用MyTrait;//支持该语法privatefunctionneededByTheTrait():string{}//不支持该语法(返回类型错误)//privatefunctionneededByTheTrait():stdClass{}//支持该语法(非静态方法变为staticmethod)//privatestaticfunctionneededByTheTrait():string{}}exit;php8添加了对匹配表达式的支持。匹配表达式类似于switch分支语句,但是匹配表达式在语义上更安全,可以直接返回值:示例代码如下'Foo',1=>'酒吧',2=>'巴兹',};退出;以上代码运行结果:PHP8引入了一个新的类型,叫做mixed,相当于array|bool|callable|int|float|null|object|resource|string。示例代码如下:当运算符的左侧评估为null时,整个代码链的执行将终止并且整体评估为null。但如果它不为空,它与普通的->运算符具有相同的功能:getAddress()?->country?->iso_code;var_dump($country);exit;以上代码运行结果: