在php中最核心的一個數據結構就是這個:
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
char *val;
int len;
} str;
HashTable *ht; /* hash table value */
zend_object_value obj;
} zvalue_value;
struct _zval_struct {
/* Variable information */
zvalue_value value; /* value */
zend_uint refcount;
zend_uchar type; /* active type */
zend_uchar is_ref;
};
這個數據結構也就是php中的每個數據類型在下層c語言中的表示。可以看到_zval_struct 結構體第一個字段是一個聯合體,他來存儲實際的值,這些值可以為long,double,字符串,hashtable(也就是php中的數組)和對象。而第2個參數是個引用計數,第三個參數是當前的類型。
也就是說php中的每個類型實際都是一個 struct _zval_struct類型。
1 首先進入php的源碼目錄下的ext文件夾,然後運行下面的命令,這樣將會生成一個my_module的文件夾。:
./ext_skel --extname=my_module
2 然後在my_module.h裡面聲明你的php函數名:
PHP_FUNCTION(my_function);
2 在my_module.c文件的my_module_functions(這裡的module就是你所創建的擴展模塊名字)加入你所要寫的php方法名:
PHP_FE(my_function, NULL)
3 接下來就實現PHP_FUNCTION(my_function)。
首先 參數的解析,當傳遞進來的php的類型和c的類型之間的轉換:
這裡要用到的函數是:
int zend_parse_parameters(int num_args TSRMLS_DC, char *type_spec, ...);
其中的php類型和c類型的對應如下:
引用
l - long
d - double
s - string (with possible null bytes) and its length
b - boolean
r - resource, stored in zval*
a - array, stored in zval*
o - object (of any class), stored in zval*
O - object (of class specified by class entry), stored in zval*
z - the actual zval*