专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »PHP教程 » 扩展名php:php的c扩展 »正文

扩展名php:php的c扩展

来源: 发布时间:星期六, 2009年9月12日 浏览:21次 评论:0
  在php中最核心个数据结构就是这个:

typedef union _zvalue_value { 
 long lval;   /* long value */ 
 double dval;  /* double value */ 
 struct { 
 char *val; 
  len; 
 } str; 
 HashTable *ht;  /* hash table value */ 
 zend_object_value obj; 
} zvalue_value; 
 
 
struct _zval_struct { 
 /* Variable information */ 
 zvalue_value value; /* value */ 
 zend_u refcount; 
 zend_uchar type; /* active type */ 
 zend_uchar is_ref; 
};


  这个数据结构也就是php中每个数据类型在下层c语言中表示可以看到_zval_struct 结构体第个字段是个联合体他来存储实际这些值可以为longdoublehashtable(也就是php中)和对象而第2个参数是个引用计数第 3个参数是当前类型

  也就是说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类型的间转换:

  这里要用到是:

 zend_parse_parameters( num_args TSRMLS_DC, char *type_spec, ...);

  其中php类型和c类型对应如下:

  引用

  l - long

  d - double

  s - (with possible null s) and its length

  b - boolean

  r - resource, stored in zval*

  a - .gif' />, stored in zval*

  o - object (of any ), stored in zval*

  O - object (of specied by entry), stored in zval*

  z - the actual zval*

  这边就看到了这里zval也就是开始介绍那个php类型结构体

  这边还可以使用 3个符号:

  | - 这个也就是或者意思

  / -将会提供当前参数个副本

  ! - 这个符号他必须进跟在a, o, O, r, z 后面 也就是说当传递进来参数为NULL时候我们pass那个指针也会被NULL

  例子:

/* 得到个long个zval */ 
long l; 
char *s; 
 s_len; 
zval *param; 
 (zend_parse_parameters(ZEND_NUM_ARGS TSRMLS_CC, 
             "lsz", &l, &s, &s_len, &param)  FAILURE) { 
  ; 
} 
 
/*传递进来个对象或者个double */ 
zval *obj; 
double d = 0.5; 
 (zend_parse_parameters(ZEND_NUM_ARGS TSRMLS_CC, 
             "O|d", &obj, my_ce, &d)  FAILURE) { 
  ; 
} 
 
/* 传递进来参数为NULL或者个对象和 */ 
zval *obj; 
zval *arr; 
 (zend_parse_parameters(ZEND_NUM_ARGS TSRMLS_CC, "O!a", &obj, &arr)  FAILURE) { 
  ; 
} 
 
/* 得到 */ 
zval *arr; 
 (zend_parse_parameters(ZEND_NUM_ARGS TSRMLS_CC, "a/", &arr)  FAILURE) { 
  ; 
} 
 
/*得到前 3个参数 */ 
zval *z; 
zend_bool b; 
zval *r; 
 (zend_parse_parameters(3, "zbr!", &z, &b, &r)  FAILURE) { 
  ; 
}


  当我们传递进来时候我们该如何遍历这个看下面代码:

zval *param; 
    HashPosition pos; 
    zval **data_value; 
     (zend_parse_parameters(ZEND_NUM_ARGS TSRMLS_CC, "a", &(param))  FAILURE) { 
   RETURN_FALSE; 
   } 
//遍历. 
    for (zend_hash_ernal_poer_re_ex(Z_ARRVAL_P(param), &pos); 
  zend_hash_get_current_data_ex(Z_ARRVAL_P(param), (void **)&data_value, &pos)  SUCCESS; 
  zend_hash_move_forward_ex(Z_ARRVAL_P(param), &pos)) 
    { 
      //现在里面值就存储在data_value这个指针里面我们可以通过对他解引用来提取值比如假设有个元素是long那么我们就可以这样来取(就是根据开头介绍那个数据结构来取): 
 
long temp=(*data_value)->value.lval; 
    }


  接下来是返回值问题,这里定义了好几个宏:

RETURN_RESOURCE( r) 
RETURN_BOOL( b)  
RETURN_NULL( ) 
RETURN_LONG( l)  
RETURN_DOUBLE(double d)  
RETURN_STRING(char *s,  dup)  
RETURN_STRINGL(char *s,  l,  dup)  
RETURN_EMPTY_STRING( )  
RETURN_FALSE  
RETURN_TRUE 


  比如我要返回个可以这么写:

 RETURN_STRING("banana", 1);

  这里讲下返回问题,下面代码是返回个嵌套:



zval *param: 
 
.gif' />_init(param); 
//_value是个全局变量(我是这么理解) 
.gif' />_init(_value); 
add_index_(param, 0, "sad",1); 
add_index_zval(_value,0, param);


  PS:更详细还是要看ext目录下面那些扩展例子



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: