文章來自: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屬性來實現的。