php8的主要新特性
命名参数
定义
声明$中的参数名称不带符号将是参数名称,或函数形参的名字取$后变为实参的命名函数
格式:
name:"nickname"
或name:$name
示例
function info($nickname, $avatar)
{
var_dump("昵称为{$nickname}、头像为{$avatar}的用户");
}
info(avatar:'avatar',nickname:'nickname');
可变参数下的应用
function info ($nickname,$avatar, ...$args):void
{
var_dump($args);
}
info('nickname','avatar',age:8,sex:'man');
// array(2) { ["age"]=> int(8) ["sex"]=> string(3) "man" }
注解
语法
#[Name]
#[Name1,Name2]
#[Name(Arguments)]
#[Name(Argunment1,Arguments2,ArgumentN)]
#[Name1(Argument),Name2(Argument),Name3(Argument)]
function show($name):void{}
示例
#[arg1]
#[arg2,arg3]
#[api('123')]
#[info('name','headimg')]
#[junp('跳'),run('跑')]
function show2($name):void{}
$docRef = new ReflectionFunction('show2');
$docAttr = $docRef->getAttributes();
foreach ($docAttr as $attrItem){
var_dump($attrItem->getName());
var_dump($attrItem->getArguments());
}
/**
* 打印结果:
* string(4) "arg1"
* array(0) {
* }
*
* string(4) "arg2"
* array(0) {
* }
*
* string(4) "arg3"
* array(0) {
* }
*
* string(3) "api"
* array(1) {
* [0]=>
* string(3) "123"
* }
*
* string(4) "info"
* array(2) {
* [0]=>
* string(4) "name"
* [1]=>
* string(7) "headimg"
* }
*
* string(4) "junp"
* array(1) {
* [0]=>
* string(3) "跳"
* }
*
* string(3) "run"
* array(1) {
* [0]=>
* string(3) "跑"
* }
*/
注解类的使用
个人理解,使用注解可以将类定义成一个个低耦合、高内聚的元数据类,灵活的注入方法或者类里,通过反射注解类示例达到调用的目的
注解类的使用示例
#[Attribute]
class initData
{
public function __construct(private string $data)
{
}
public function show()
{
return $this->data;
}
}
#[initData('123')]
class serviceData{}
$classRef = new ReflectionClass('serviceData');
$classAttr = $classRef->getAttributes('initData')[0];
$docClassObj = $classAttr->newInstance();
var_dump($docClassObj->show()); // 123
构造器属性提升
定义
构造器属性提升是php8的一个新语法,允许从构造函数直接进行类属性声明和构造函数赋值。
示例
// 旧代码
class User
{
public string $name;
public function __construct(string $name) {
$this->name = $name;
}
}
// 新代码
class User
{
public function __construct(public string $name) {}
}
联合类型
低版本只能为属性、参数和返回类型声明单个类型。
属性
class Person{
public string $name;
public function __construct(public string|array $name){
var_dump($this->name);
}
}
new Person([]);
参数
function show(int|string $a){
var_dump($a);
}
show('123');
返回类型
function show(int|string $a):int|string{
var_dump($a);
return 5;
}
echo show('123');
Nullsafe空安全运算符
这个特性就很棒了
示例
// 旧版本用if判断,if地狱
if($session!==null){
$user = $session->user;
if($user!==null){
$address = $user->getAddress();
if($address!=null){
$country = $address->country;
if($country!==null){
var_dump($country);
}
}
}
}
// 新版本
echo $session?->user?->getAddress()?->country
Match表达式
感觉和switch差不多,但是执行严格匹配(===),然后匹配不到就会抛出错误 UnhandledMatchError
示例
$key = 'b';
$str = match($key) {
'a' => 'this a',
'c' => 'this c',
0 => 'this 0',
'b' => 'last b',
};
echo $str;//输出 last b
参考资料:PHP8新特性技术详解2021版