PHP语法问题:如何在Trait中评估类常量字符串为代码
问题解决:Trait中正确获取类常量的方法
需求:在定义Trait时,编写一个方法实现以下逻辑:如果当前使用Trait的类存在指定名称的类常量,且该常量是数组,则返回常量内容;否则返回空数组。
原代码报错原因:使用${self::class . "::" . $constant}这种变量解析方式无法正确访问类常量,PHP不支持该语法获取类常量值。
正确实现方案
使用PHP内置的constant()函数获取类常量的值,该函数可接收包含类名与常量名的完整字符串参数,返回对应常量的内容。
修正后的Trait代码
trait FooBar { public static function getChildArrayConstant(string $constant): array { $fullConstantName = self::class . "::" . $constant; // 判断常量是否存在 if (!defined($fullConstantName)) { return []; } $result = constant($fullConstantName); // 校验是否为数组,符合则返回值,否则返回空数组 return is_array($result) ? $result : []; } public function do() { var_dump(self::getChildArrayConstant("FOO")); // 返回 [] var_dump(self::getChildArrayConstant("BAR")); // 返回 ["foo","bar"] } }
实现类代码(无需修改)
class Meow { use FooBar; public const BAR = ["foo", "bar"]; public function doMeow() { $this->do(); } }
代码说明
- 拼接完整常量名称:通过
self::class自动获取当前使用Trait的类名,与传入的常量名拼接成完整的常量标识字符串。 - 常量存在性校验:用
defined()函数判断目标常量是否存在,不存在直接返回空数组。 - 取值与类型校验:若常量存在,用
constant()获取其值,再通过is_array()判断是否为数组,符合条件则返回该值,否则返回空数组。
内容的提问来源于stack exchange,提问作者Blackbam
相关产品推荐
相关产品推荐

