一步一步开发PHP扩展(5):字符串处理

php7扩展开发教程

在采用PHP开发中字符串处理和数组处理是我们最常见的功能,今天我们就通过实例来学习下在PHP扩展中字符串是如何处理的。

首先看下面一段PHP代码。

  1. <?php
  2. function str_concat($prefix$string) {
  3.     $len = strlen($prefix);
  4.     $substr = substr($string, 0, $len);
  5.     if ($substr != $prefix) {
  6.         return $prefix." ".$string;
  7.     } else {
  8.         return $string;
  9.     }
  10. }
  11. echo str_concat("hello""word");
  12. echo "\n";
  13. echo str_concat("hello""hello bo56.com");
  14. echo "\n";
  15. ?>

上述str_concat方法主要有两个功能:

①当字符串不包含指定前缀字符串时,把前缀字符串和被检测字符合并返回。

②当字符串包含指定前缀字符串时,原样返回。

接下来我们看下在如何在PHP扩展中开发str_concat功能,这里我们继续把str_concat函数写在say的扩展中,代码如下:

  1. PHP_FUNCTION(str_concat)
  2. {
  3.     zend_string *prefix, *subject, *result;
  4.     zval *string;
  5.     if (zend_parse_parameters(ZEND_NUM_ARGS(), "Sz", &prefix, &string) == FAILURE) {
  6.        return;
  7.     }
  8.     subject = zval_get_string(string);
  9.     if (zend_binary_strncmp(ZSTR_VAL(prefix), ZSTR_LEN(prefix), ZSTR_VAL(subject), ZSTR_LEN(subject), ZSTR_LEN(prefix)) == 0) {
  10.         RETURN_STR(subject);
  11.     }
  12.     result = strpprintf(0, "%s %s", ZSTR_VAL(prefix), ZSTR_VAL(subject));
  13.     RETURN_STR(result);
  14. }

代码解读:

zend_string是PHP7新增的结构。结构如下:

  1. struct _zend_string {
  2.     zend_refcounted_h gc; /*gc信息*/
  3.     zend_ulong        h;  /* hash value */
  4.     size_t            len; /*字符串长度*/
  5.     char              val[1]; /*字符串起始地址*/
  6. };

Zend/zend_string.h提供了一些zend_string处理的一些方法。ZSTR_开头的宏方法是zend_string结构专属的方法。主要有如下几个:

  1. #define ZSTR_VAL(zstr)  (zstr)->val
  2. #define ZSTR_LEN(zstr)  (zstr)->len
  3. #define ZSTR_H(zstr)    (zstr)->h
  4. #define ZSTR_HASH(zstr) zend_string_hash_val(zstr)

ZSTR_VAL 、ZSTR_LEN ZSTR_H宏方法分别对应zend_string结构的成员。ZSTR_HASH是获取字符串的hash值,如果不存在,就调用hash函数生成一个。

代码中故意把第二个参数转换成zval。主要是为了展现zend为我们提供了一系列的操作方法。如,zval_get_stringzend_binary_strncmp

这些方法在Zend/zend_operators.h文件中。更多宏方法请查看 Zend/zend_API.h中的相关代码。

 

你想把广告放到这里吗?

发表评论

您必须 登录 才能发表留言!