[PHP原始碼閱讀]strlen函式

hoohack發表於2019-05-10

文章來自:http://www.hoohack.me/2016/02/22/phps-source-analytics-strlen

我在github有對PHP原始碼更詳細的註解。感興趣的可以圍觀一下,給個star。PHP5.4原始碼註解。可以通過commit記錄檢視已新增的註解。

strlen函式說明。

int strlen ( string $string )

這篇文章,我們可以知道strlen函式是通過Zend Engine定義的。函式的定義可以在這裡檢視。

在這裡也給出函式的原始碼:

ZEND_FUNCTION(strlen)
{
    char *s1;
    int s1_len;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &s1, &s1_len) == FAILURE) {
        return;
    }

    RETVAL_LONG(s1_len);
}

該文章講到,該函式很簡單,並不需要進一步的解釋。而這篇文章也有對zend_parse_parameters函式做介紹。筆者較笨,於是便想理解zend_parse_parameters函式是怎麼返回變數長度的。

zend_parse_arg_impl函式,就是解析引數的地方,我們繼續看case `s`的分支。這個分支是對字串變數的解析。

int *pl = va_arg(*va, int *);是字串長度變數的定義。

繼續往下看,可以看到對pl變數的賦值語句:*pl = Z_STRLEN_PP(arg);

Z_STRLEN_PP巨集的定義在zend_operators.h檔案中:

#define Z_STRLEN_PP(zval_pp)    Z_STRLEN(**zval_pp)

再繼續看Z_STRLEN巨集的定義,#define Z_STRLEN(zval) (zval).value.str.len。由此我們可以知道,strlen函式是通過直接返回zval結構體中的str的len屬性來實現的。

相關文章