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

PHP8.1的enum分析

时间:2023-03-30 01:08:54 PHP

PHP8.1发布了,一个enum有很多需要注意的地方。Enum基本上是一个限定类,我们来看看它的语法结构。enum_declaration_statement:T_ENUM{$$=CG(zend_lineno);}T_STRINGenum_backing_typeimplements_listbackup_doc_comment'{'class_statement_list'}'{$$=zend_ast_create_decl(ZEND_AST_CLASS,$ZEND_ACC_ENUM|ZEND_ACC_FINAL,$UL,$6,zend_$ast_get_5,NStr($8,NULL,$4);};枚举开始with关键字,后面跟optional:(string|int),因为是类,所以可以实现接口implementSomeInterface,MoreInterface,又因为加了ZEND_ACC_FINAL,相当于最终类className,所以不能继承其他enumerationtypes.definevalue;//获取枚举类型元素的keyechoWeek::Monday->name;Week::Monday是这个枚举类型的一个实例,它相当于一个普通类的对象。注意枚举类型不能被实例化,也没有构造函数和析构函数。如果使用new实例化Week,则会出现致命错误。按值获取实例枚举周:string{caseMonday='monday';caseTuesday='tuesday';}var_dump(Week::from('monday'));var_dump(Week::tryFrom('money'));Week::from返回Worker::Monday,这是Week的一个实例.tryFrom和from的区别在于,如果传入一个不存在的值,表单会报错,而tryFrom返回null。TryFrom配合新的语法,代码会更精简。//不要用tryFromtry;}//使用tryFrom添加新语法$value=Week::tryFrom('no_exists_value')?->value;tips:from和tryFrom方法不能被重写。enum定义方法enumWeek:string{caseMonday='monday';case星期二='星期二';publicfunctiontest(){echo'test'.PHP_EOL;}}Week::Monday->test();调用和普通类一样,实例->方法名,所以只要记住Week::Monday返回一个实例,其他操作和类高度相似。枚举实现接口