摘要:PHP8中不但新增了许多新特性,还新增了很多方法及系统优化,例如新的Mixed伪类型、新增的三个字符串函数:str_contains、str_starts_with、str_ends_with...
在上一篇文章中,我们总结了PHP8中的一部分新特性,这篇中主要总结PHP8新增的方法及系统优化。
1.新的Mixed伪类型
function show(mixed $name){ var_dump($name); } show(true);
mixed等效于所有类型的联合类型
string|int|float|bool|null|array|object|callable|resource
2.新增的三个字符串函数
str_contains
str_contains检查另一个字符串中是否包含一个字符串,并返回一个布尔值(true/ false)是否找到该字符串
以往检查字符串是否包含在另一个字符串中的典型方法通常是使用函数strpos或strstr。
str_contains("abc", "a"); // true str_contains("abc", "d"); // false // 空字符串是,都是返回true str_contains("abc", ""); // true str_contains("", ""); // true
str_starts_with
str_starts_with检查一个字符串是否以另一个字符串开头并是否返回布尔值(true/ false)。
str_ends_with
str_ends_with检查一个字符串是否以另一个字符串结尾,是否返回布尔值(true/ false)。
$str = "beginningMiddleEnd"; var_dump (str_starts_with($str, "beg")) ; //true var_dump (str_starts_with($str, "Beg")); //false var_dump (str_ends_with($str, "End")) ;//true var_dump (str_ends_with($str, "end"));//false // 空字符串:任何字符串以空字符串去检查都是true var_dump (str_starts_with("a", "")) ;//true var_dump (str_starts_with("", "")) ;//true var_dump (str_starts_with("", "a"));//false var_dump (str_ends_with("a", "")) ;//true var_dump (str_ends_with("", "")) ;//true var_dump (str_ends_with("", "a"));//false
3.新增Static类方法的返回类型
class Foo { public static function getInstance(): static { return new static(); } }
4.可选参数之后禁止出现必选参数
//这里在PHP8中会报错 function show($age=18,$name){ echo "$name,$age"; } show(25, 'yzmcms');
5.继承规则不适用于Private类方法
class Foo { final private function testFoo(){} }
以上代码在PHP8中会报错,私有方法不能是final,因为它们从不被其他类重写。
6.非静态方法不允许以静态方式来调用
class Person{ public function show(){ echo 123; } } Person::show();
以上代码在PHP7中这么写只是会报一个Deprecated错误,但也会正常执行,而在PHP8中将会报Fatal error
7.字符串和数字比较调整
在php8中,数字和字符串比较时,会将数字转成字符串,正好和之前相反。
//php7 0 == 'foobar' // true //php8 0 == 'foobar' // false
8.@运算符不再使致命错误不提醒
此更改可能会使 PHP 8 之前的版本被 @ 隐藏的错误再次显示出来。请确保在生产服务器上设置了 display_errors=Off !
9.重新分类的引擎警告
许多以前仅触发警告或通知的错误已转换为适当的错误。以下警告已更改:
变量未定义:Error 异常代替通知
数组索引未定义:警告代替通知
除以零:DivisionByZeroError 异常代替警告
尝试添加 / 移除非对象的属性 '% s' :Error 异常代替警告
尝试修改非对象的属性 '% s' :Error 异常代替警告
尝试分配非对象的属性 '% s' :Error 异常代替警告
从空值创建默认对象:Error 异常代替警告
尝试获取非对象的属性 '% s' :警告代替通知
未定义的属性:% s::$% s:警告代替通知
无法添加元素到数组,因为下一个元素已被占用:Error 异常代替警告
无法在非数组变量中销毁偏移量:Error 异常代替警告
无法将标量值用作数组:Error 异常代替警告
只有数组和 Traversables 可以被解包:TypeError 异常代替警告
为 foreach () 提供了无效的参数:TypeError 异常代替警告
偏移量类型非法:TypeError 异常代替警告
isset 或 empty 中的偏移量类型非法:TypeError 异常代替警告
unset 中的偏移量类型非法:TypeError 异常代替警告
数组到字符串的转换:警告代替通知
资源 ID#% d 用作偏移量,转换为整数 (% d):警告代替通知
发生字符串偏移量转换:警告代替通知
未初始化的字符串偏移量:% d:警告代替通知
无法将空字符串分配给字符串偏移量:Error 异常代替警告
提供的资源不是有效的流资源:TypeError 异常代替警告