php zend操作常量,定义常量,判断常量是否存在,取常量的值
zend
常量
php
编程技术
发布日期
2023-06-05
更新日期
2023-06-05
阅读次数 97
文章字数 1.3k
php常量定义,通常用 zend_register_xxx_constant 定义
引入的头文件:#include "zend_constants.h"
常量存储在EG(zend_constants)里,可以直接查找,当然了如果要取值则用zend_get_constant_str会简单一点。
//定义字符串常量,除了string,还有null,bool,long,double,或者REGISTER_NS_XXX系列的宏用于带namespace的常量注册,如果还不满足可使用 zend_register_constant 注册数组等类型
zend_register_string_constant("APP_ROOT",strlen("APP_ROOT"),"1223232",CONST_PERSISTENT,0);//CONST_PERSISTENT值为1,表示永久, module_number为引擎标识,这里简单一点填0
//取$_SERVER
// zval **c;
zend_string * zs = zend_string_init("BASE_ROOT",sizeof("BASE_ROOT")-1,0);
zval *c = zend_hash_find(EG(zend_constants),zs); //直接查询EG(zend_constants)判断常量
if (!c) {
RETURN_STRING("未定义常量BASE_ROOT");
}else{
//取常量的值
zval *BASE_ROOT = zend_get_constant_str("BASE_ROOT",sizeof("BASE_ROOT")-1);
char *str = Z_STRVAL_P(BASE_ROOT); //已知外部定义该值是字符串,转字符串
RETURN_STRING(str);
}
module_number是一个加载扩展或者卸载扩展时的标识。而你不需要关注它,它会自动加载到你扩展中的MINIT和RINIT中,所以在你用上面4个函数声明常量的时候, 你可以这样写:
PHP_MINIT_FUNCTION(sample4) {
register_string_constant("SAMPLE4_VERSION",
sizeof("SAMPLE4_VERSION"),
PHP_SAMPLE4_EXTVER,
CONST_CS | CONST_PERSISTENT,
module_number TSRMLS_CC);
return SUCCESS;
}
除了数组和对象外,其他变量你也可以用来注册一个常量,但是因为没有宏和ZEND API去支持这些声明,所以你必须手动声明一个常量,通过下面一个例子来了解一下:
void php_sample4_register_boolean_constant(char *name, uint len,
zend_bool bval, int flags, int module_number TSRMLS_DC)
{
zend_constant c;
ZVAL_BOOL(&c.value, bval);
c.flags = CONST_CS | CONST_PERSISTENT;
c.name = zend_strndup(name, len - 1);
c.name_len = len;
c.module_number = module_number;
zend_register_constant(&c TSRMLS_CC);
}
文章作者: 朱丰华
文章链接: https://smart.52dixiaowo.com/blog/post-423.html
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。
zend
常量
php
发表评论
相关推荐