程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> php的c擴展

php的c擴展

編輯:PHP綜合

在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*

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved