php扩展中,取字符串常量的值

php 常量 扩展 编程技术
发布日期 2023-05-31 更新日期 2023-06-02 阅读次数 149 文章字数 1.5k

php的常量,存储在EG(zend_constants)哈希表中

在php源码里添加常量

<?php


define("BASE_ROOT","122");
test1();  //调用扩展函数
 
c扩展函数test1中取该常量的值
 
void zif_test1(INTERNAL_FUNCTION_PARAMETERS)
{
    //取字符串常量
    zval *BASE_ROOT = zend_get_constant_str("BASE_ROOT",sizeof("BASE_ROOT")-1);
    char *str = Z_STRVAL_P(BASE_ROOT);  //转字符串
    php_printf("常量BASE_ROOT的值是:%s",str);
}
 
在C扩展函数里,当然也可以写原生的c函数,其中 zval 表示任意类型,zend_get_constant_str取某个常量,Z_STRVAL_P把zval转字符串,即char *
执行结果:
 
常量BASE_ROOT的值是:122
 
注意,不能直接printf,

如果你需要 printf(),即打印格式化到输出流,则使用 php_printf()。该函数在内部使用 spprintf(),因此执行动态分配,以便将其发送到 SAPI 输出(在 CLI 的情况下又称为 stdout),或输出缓冲区(CGI 缓冲区)后将其释放,用于其他 SAPI。

把zval类型,转字符串类型,也可以使用

    char *str = Z_STRVAL(*BASE_ROOT);  //转字符串【注意不是Z_STRVAL_P,且带*】,同样效果
    php_printf("常量BASE_ROOT的值是:%s",str);

 获取不同类型zval的value,注意_P表示指针

Z_LVAL(zval)、Z_LVAL_P(zval_p)    返回zend_long
Z_DVAL(zval)、Z_DVAL_P(zval_p)    返回double
Z_STR(zval)、Z_STR_P(zval_p)    返回zend_string*
Z_STRVAL(zval)、Z_STRVAL_P(zval_p)    返回char*,即:zend_string->val
Z_STRLEN(zval)、Z_STRLEN_P(zval_p)    获取字符串长度
Z_STRHASH(zval)、Z_STRHASH_P(zval_p)    获取字符串的哈希值
Z_ARR(zval)、Z_ARR_P(zval_p)、Z_ARRVAL(zval)、Z_ARRVAL_P(zval_p)    返回zend_array*
Z_OBJ(zval)、Z_OBJ_P(zval_p)    返回zend_object*
Z_OBJ_HT(zval)、Z_OBJ_HT_P(zval_p)    返回对象的zend_object_handlers,即zend_object->handlers
Z_OBJ_HANDLER(zval, hf)、Z_OBJ_HANDLER_P(zv_p, hf)    获取对象各操作的handler指针,hf为write_property、read_property等,注意:这个宏取到的为只读,不要试图
修改这个值(如:Z_OBJ_HANDLER(obj, write_property) = xxx;),因为对象的handlers成员前加了const修饰符
Z_OBJCE(zval)、Z_OBJCE_P(zval_p)    返回对象的zend_class_entry*
Z_OBJPROP(zval)、Z_OBJPROP_P(zval_p)    获取对象的成员数组
Z_RES(zval)、Z_RES_P(zval_p)    返回zend_resource*
Z_RES_HANDLE(zval),Z_RES_HANDLE_P(zval_p)    返回资源handle
Z_RES_TYPE(zval)、Z_RES_TYPE_P(zval_p)    返回资源type
Z_RES_VAL(zval)、Z_RES_VAL_P(zval_p)    返回资源ptr
Z_REF(zval)、Z_REF_P(zval_p)    返回zend_reference*
Z_REFVAL(zval)、Z_REFVAL_P(zval_p)    返回引用的zval*

文章作者: 朱丰华

文章链接: https://smart.52dixiaowo.com/blog/post-408.html

版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。

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用户自定义变量

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

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

115    评论    点赞
朱丰华   |   1年前   |   sed · 文件

Shell 指定行处理head、tail、sed

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

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

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

php正则表达式原生字符

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

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

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

windows下编写、编译php扩展

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

linux下编写、编译php扩展

150    评论    点赞
朱丰华   |   1年前   |   html

npm clean-mark,抓取网页文章内容,转换成markdown、html、txt

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

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

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

yakpro-po混淆php代码

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

php扩展编译nts的方法

86    评论    点赞
朱丰华   |   1年前   |   js · 模块 · nodejs

nodejs引入自定义模块

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

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

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

php json_encode对字符串转义用法

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

php Fatal error怎么捕获

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

{{item.title}}

{{item.uv}}    评论    点赞