1.php的常量 就是一个简单的标识符,脚本执行期间不会改变,大小写敏感,默认大写。
常量的存储结构
typedef struct _zend_constant { zval value; //常量值 zend_string *name; //常量名 int flags; //常量标识位 int module_number; //所属扩展、模块 } zend_constant;
flag代表的含义 : CONST_CS: 大小写敏感
CONST_PERSISTENT: 持久化的(只有通过扩展、内核定义的才支持,这种常量不会在request结束时清理掉)
CONST_CT_SUBST: 允许编译时替换 (编译时如果发现有地方在读取常量的值,那么编译器会尝试直接替换为常量值-》TRUE、FALSE、NULL)
常量的销毁 常量存储在EG(zend_constants)哈希表中,根据常量名直接查找hash表
非持久化常量在request请求结束时销毁,从哈希表末尾开始向前遍历EG(zend_constants),将非持久化常量删除,直到碰到第一个持久化常量时,停止遍历,正常情况下所有通过扩展定义的常量一定是在PHP中通过define定义之前。
持久化常量是在php_module_shutdown()
阶段销毁的