基于PHP7的PHP扩展开发之四(字符串的处理)

php相关 / 2017年03月23日 11时54分 / 6797人浏览
目的:熟悉字符串在PHP扩展里面如何处理 要实现的PHP代码如下: 1、当字符串不包含指定前缀字符串时,把前缀字符串和被检测字符合并返回。 2、当字符串包含指定前缀字符串时,原样返回。 我们将使用PHP扩展的方式实现str_concat功能。

基础代码 在myecho扩展上增加 str_concat 方法。 实现str_concat方法 str_concat方法的PHP扩展源码:
PHP_FUNCTION(str_concat)
{
    zend_string *prefix, *subject, *result;
    zval *string;

    if (zend_parse_parameters(ZEND_NUM_ARGS(), "Sz", &prefix, &string) == FAILURE) {
       return; 
    }   

    subject = zval_get_string(string);
    if (zend_binary_strncmp(ZSTR_VAL(prefix), ZSTR_LEN(prefix), ZSTR_VAL(subject), ZSTR_LEN(subject), ZSTR_LEN(prefix)) == 0) {
        RETURN_STR(subject); 
    }   
    result = strpprintf(0, "%s %s", ZSTR_VAL(prefix), ZSTR_VAL(subject));
    RETURN_STR(result);
}
找到PHP_FE_END 在上面增加
PHP_FE(str_concat, NULL)
代码说明 zend_string是PHP7新增的结构。结构如下: [codee] struct _zend_string { zend_refcounted_h gc; /*gc信息*/ zend_ulong h; /* hash value */ size_t len; /*字符串长度*/ char val[1]; /*字符串起始地址*/ }; [/codee] 在Zend/zend_string.h提供了一些zendstring处理的一些方法。 ``ZSTR``开头的宏方法是zend_string结构专属的方法。主要有如下几个: [codee] #define ZSTR_VAL(zstr) (zstr)->val #define ZSTR_LEN(zstr) (zstr)->len #define ZSTR_H(zstr) (zstr)->h #define ZSTR_HASH(zstr) zend_string_hash_val(zstr) [/codee] ZSTR_VAL ZSTR_LEN ZSTR_H宏方法分别对应zend_string结构的成员。ZSTR_HASH是获取字符串的hash值,如果不存在,就调用hash函数生成一个。 代码中故意把第二个参数转换成zval。主要是为了展现zend为我们提供了一些列的操作方法。如,zval_get_string, zend_binary_strncmp。 这些方法在Zend/zend_operators.h文件中。 更多宏方法请查看 Zend/zend_API.h中的相关代码。 编译生成扩展 参考《基于PHP7的PHP扩展开发之一(hello word)》 测试

输出

hello word
hello lostphp.com