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" } }