mydeer
就像我们从来没有来过这里,但这种感觉似曾相识。
PHP扩展之 -- 返回数组

今天写个返回数组的扩展,通过调用扩展函数,能得到一个PHP的数组。

数组在Zend里面使用Hashtable来承载的。数组的内部结构是个Hashtable。

看看PHP的数组对应在c扩展里面怎么实现吧:

$arr = array(); array_init(arr);             Initialize a new array
$arr[] = NULL;  add_next_index_null(arr);   Add a value of a given type to a numerically indexed array
$arr[] = 42;    add_next_index_long(arr,4,2);
$arr[] = true;  add_next_index_bool(arr,1);
$arr[] = 3.14;  add_next_index_double(arr,3.14);
$arr[] = 'foo'; add_next_index_string(arr,"foo",1);
$arr[] = $myvar; add_next_index_zval(arr,myvar);
$arr[0] = NULL; add_index_null(arr0);     Add a value of a given type to a specific index in an array
$arr[1] = 42;   add_index_long(arr,1,42);
$arr[2] = true; add_index_bool(arr,2,1);
$arr[3] = 3.14; add_index_double(arr,3,3.14);
$arr[4] = 'foo';add_index_string(arr,4,"foo",1);
$arr[5] = $myvar; add_index_zval(arr,5,myvar);
$arr['abc'] = NULL; add_assoc_null(arr,"abc"); Add a value of a given type to an associatively indexed array
$arr['def'] = 711; add_assoc_long(arr,"def",711);
$arr['ghi'] = true; add_assoc_bool(arr,"ghi",1);
$arr['jkl'] = 1.44; add_assoc_double(arr,"jkl",1.44);
$arr['mno'] = 'baz'; add_assoc_string(arr,"mno","baz",1);
$arr['pqr'] = $myvar; add_assoc_zval(arr,"pqr",myvar);

那么看完之后知道在PHP的扩展里面编写了吧,直接上扩展的程序,编译的过程其他文章有这里不写了:

扩展代码

PHP_FUNCTION(helloc)
{
    char *str;
    zval *subarray;
    array_init(return_value);
    add_index_long(return_value,8,123);
    add_next_index_string(return_value,"I'm is a string of index 9",1);
    add_next_index_stringl(return_value,"this is string of auto index 10",31,1);
    str = estrdup("eleven");
    add_next_index_string(return_value,str,0);
    add_assoc_double(return_value,"pi",3.1415926535);
    
    ALLOC_INIT_ZVAL(subarray);
    array_init(subarray);
    add_next_index_string(subarray,"hello",1);
    add_assoc_zval(return_value,"subarray",subarray);

}

我们来看看为什么没有返回呀,return_value又是哪儿来的。其实:扩展编写过程中return_value被隐藏了起来,其实它是在每个PHP_FUNCTION()原型中定义的一个函数参数。Zend Engine会为它分配内存,然后初始化为NULL,所以即使你的函数没有实际的去设置这个变量,其也有了一个可以被调用程序所用的值。当你的内部函数执行完之后,Zend Engine会把这个变量的值传递给调用程序,或者如果调用程序被告知忽略这个变量,则释放掉它。

在PHP里面执行:

<?php
var_dump(helloc());

结果

array(6) {
  [8]=>
  int(123)
  [9]=>
  string(26) "I'm is a string of index 9"
  [10]=>
  string(31) "this is string of auto index 10"
  [11]=>
  string(6) "eleven"
  ["pi"]=>
  float(3.1415926535)
  ["subarray"]=>
  array(1) {
    [0]=>
    string(5) "hello"
  }
}
<< 上一篇 堆和栈的区别 之 数据结构和内存 使用PHP引用时需注意的陷阱 -- foreach 下一篇 >>
文章标签
随意 | Created At 2014 By William Clinton | 蜀ICP备14002619号-4 |