php扩展中,取字符串常量的值
php
常量
扩展
编程技术
发布日期
2023-05-31
更新日期
2023-06-02
阅读次数 164
文章字数 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
常量
扩展
发表评论
相关推荐