1. 程式人生 > >PHP7擴充套件開發之字串處理

PHP7擴充套件開發之字串處理

前言

這次,我們來看看字串在PHP擴充套件裡面如何處理。
示例程式碼如下:

<?php
function str_concat($prefix, $string) {
    $len = strlen($prefix);
    $substr = substr($string, 0, $len);
    if ($substr != $prefix) {
        return $prefix." ".$string;
    } else {
        return $string;
    }   
}

echo str_concat("hello", "word"
); echo "\n"; echo str_concat("hello", "hello bo56.com"); echo "\n"; ?>

上面的str_concat方法實現瞭如下功能:
1、當字串不包含指定字首字串時,把字首字串和被檢測字符合並返回。
2、當字串包含指定字首字串時,原樣返回。
我們將使用PHP擴充套件的方式實現str_concat功能。

程式碼

基礎程式碼

這個擴充套件,我們將在say擴充套件上增加 str_concat 方法。say擴充套件相關程式碼大家請看這篇博文。PHP7擴充套件開發之hello word 文中已經詳細介紹瞭如何建立一個擴充套件和提供了原始碼下載。

實現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); }

程式碼說明

zend_string是PHP7新增的結構。結構如下:

struct _zend_string {
    zend_refcounted_h gc; /*gc資訊*/
    zend_ulong        h;  /* hash value */
    size_t            len; /*字串長度*/
    char              val[1]; /*字串起始地址*/
};

Zend/zend_string.h提供了一些zend_string處理的一些方法。
ZSTR_開頭的巨集方法是zend_string結構專屬的方法。主要有如下幾個:

#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)

ZSTR_VAL ZSTR_LEN ZSTR_H巨集方法分別對應zend_string結構的成員。ZSTR_HASH是獲取字串的hash值,如果不存在,就呼叫hash函式生成一個。

程式碼中故意把第二個引數轉換成zval。主要是為了展現zend為我們提供了一些列的操作方法。如,zval_get_string, zend_binary_strncmp
這些方法在Zend/zend_operators.h檔案中。

原始碼下載