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

发表评论

相关推荐
朱丰华   |   7个月前   |   php

php判断是否被iframe

221    评论    点赞
朱丰华   |   1年前   |   php

php正则表达式定界符:异常Delimiter must not be alphanumeric or backslash

190    评论    点赞
朱丰华   |   1年前   |   php · 缓存 · opcache

php 加速、提高并发opcache

198    评论    点赞
朱丰华   |   1年前   |   正则 · 表达

正则表达式,实现if...then...else

113    评论    点赞
朱丰华   |   1年前   |   变量 · mysql · sql · 用户

MySQL用户自定义变量

94    评论    点赞
朱丰华   |   1年前   |   sql · php

PHP如何使用PDO批量执行SQL?

114    评论    点赞
朱丰华   |   1年前   |   php · 字符 · 字符串

如何在 PHP 中将字符串的第一个字母转换为大写

148    评论    点赞
朱丰华   |   1年前   |   php · 字符 · 正则

php正则表达式原生字符

85    评论    点赞
朱丰华   |   1年前   |   字符 · php · 比较

PHP比较字符串大小相关函数

110    评论    点赞
朱丰华   |   1年前   |   php

windows下编写、编译php扩展

158    评论    点赞
朱丰华   |   1年前   |   linux · php

linux下编写、编译php扩展

150    评论    点赞
朱丰华   |   1年前   |   js · export · import

js es6 export,import,export default的用法和区别

124    评论    点赞
朱丰华   |   1年前   |   php · 混淆 · obfuscate · git

yakpro-po混淆php代码

105    评论    点赞
朱丰华   |   1年前   |   php

php扩展编译nts的方法

85    评论    点赞
朱丰华   |   1年前   |   linux · 变量 · 环境

linux查看环境变量、设置环境变量

94    评论    点赞
朱丰华   |   1年前   |   js · php · 字符 · 字符串

php json_encode对字符串转义用法

135    评论    点赞
朱丰华   |   1年前   |   php · 捕获

php Fatal error怎么捕获

126    评论    点赞
朱丰华   |   1年前   |   php · 编译

ubuntu、centos系统从源码编译指定版本php--超详细

158    评论    点赞
朱丰华   |   1年前   |   php · git · 编译

从源码编译php

135    评论    点赞
朱丰华   |   1年前   |   php · zend · 反射 · api

php zend引擎api接口:ZENDAPI阅读,反射调用示例

123    评论    点赞
{{item.author_name}}   |   {{new Date(item.date*1000).log()}}   |   {{it}} ·

{{item.title}}

{{item.uv}}    评论    点赞