PHP 8.3 新特性 - 动态类常量和枚举成员

作者: 温新

图书: 【PHP 8.3 新特性】

阅读: 683

时间: 2024-11-24 11:53:35

hi,我是温新,一名 PHPer

PHP 8.3 中,增加使用变量名获取类常量和 Enum 对象。这使得开发者能够在运行时更灵活地操作类和枚举。

动态类常量

动态访问类常量使用语法格式为:类名::${变量名}

<?php

class Person {
    public const string NAME = '王美丽';
}

// 定义一个变量,其值是类常量的名称
$constName = 'NAME';
// 访问类常量
echo Person::{$constName};

在 PHP 8.3 之前,不允许使用 ClassName::{$varName} 语法访问类常量,并导致语法错误:

PHP Parse error:  syntax error, unexpected token ";", expecting "(" in

枚举成员

<?php

enum StatusEnum: string {
    case Draft = '草稿';
}

$enumName = 'Draft';
// PHP 8.3
echo StatusEnum::{$enumName}->value;

// PHP 8.3 之前 
echo \constant("StatusEnum::$enumName")->value;

PHP 8.3 之前

在 PHP 8.3 之前,访问类常量和 Enum 成员的唯一方法是 constant() 函数

echo \constant("Person::$constName");
echo \constant("StatusEnum::$enumName")->value;

未定义的常量和枚举行为

尝试访问未定义的类常量或枚举成员时,行为没有变化。它们都会导致未定义的常量错误:

<?php

enum StatusEnum: string {
    case Draft = '草稿';
}

$enumName = 'DraftTest';
// 访问一个未定义的常量
echo StatusEnum::{$enumName}->value;
PHP Fatal error:  Uncaught Error: Undefined constant StatusEnum::Drafti in 

::class 魔术常量

::class 魔术常量,它返回类/枚举的完全限定类名,也允许使用新语法:

<?php

class Person {
}

$constant = 'class';
echo Person::{$constant}; // Person

echo Person::class; // Person

类型错误

尝试使用返回除字符串以外任何类型的表达式获取类常量或枚举成员会导致 TypeError 异常。

<?php

class Person {
    public const string NAME = '丽丽';
}

// 访问类中存在的常量 
$constant1 = 'NAME';
echo Person::{$constant1};

// 访问类中不存在的常量
// $constant2 = 'AGE';
// echo Person::{$constant2};

// 使用数字访问
$constant3 = 19;
echo Person::{$constant3};

错误

PHP Fatal error:  Uncaught TypeError: Cannot use value of type int as class constant name in
请登录后再评论