|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
《PHP+MYSQLWEB开发(第三版)》号称圣经级,(也许是个不错的选择(声明:作者没给我啥好处费,我也不是书托,隔着大老远,我连他老兄的面都没见过的说-_-)PHP中常常利用数组,PHP的数组壮大,并且速率也快,读写都能够在O(1)内完成,由于它每一个元素的巨细都是分歧的,只需晓得下标,即可以刹时盘算出其对应的元素在内存中的地位,从而间接掏出大概写进。那末内核中数组是怎样完成的呢?
PHP年夜部分功效,都是经由过程HashTable来完成,个中就包含数组。
HashTable即具有双向链表的长处,同时具有能与数据对抗的操纵功能。
<ulclass="dlg"><liclass="dlg_cleareven">PHP中的界说的变量保留在一个标记内外,而这个标记表实在就是一个HashTable,它的每个元素都是一个zval*范例的变量。不但云云,保留用户界说的函数、类、资本等的容器都是以HashTable的情势在内核中完成的。上面分离来看在PHP、内核中怎样界说数组。
数组界说的完成
PHP中界说数组:- [/code]
- 在内核中利用宏来完成:
- [code]zval*array;array_init(array);add_assoc_string(array,"key","value",1);
复制代码 将上述代码中的宏睁开:- zval*array;ALLOC_INIT_ZVAL(array);Z_TYPE_P(array)=IS_ARRAY;HashTable*h;ALLOC_HASHTABLE(h);Z_ARRVAL_P(array)=h;zend_hash_init(h,50,NULL,ZVAL_PTR_DTOR,0);zval*barZval;MAKE_STD_ZVAL(barZval);ZVAL_STRING(barZval,"value",0);zend_hash_add(h,"key",4,&barZval,sizeof(zval*),NULL);
复制代码 便利的数组宏操纵
内核为我们供应了便利的宏来办理数组。
- //add_assoc_*系列函数:add_assoc_null(zval*aval,char*key);add_assoc_bool(zval*aval,char*key,zend_boolbval);add_assoc_long(zval*aval,char*key,longlval);add_assoc_double(zval*aval,char*key,doubledval);add_assoc_string(zval*aval,char*key,char*strval,intdup);add_assoc_stringl(zval*aval,char*key,char*strval,uintstrlen,intdup);add_assoc_zval(zval*aval,char*key,zval*value);//备注:实在这些函数都是宏,都是对add_assoc_*_ex函数的封装。//add_index_*系列函数:ZEND_APIintadd_index_long(zval*arg,ulongidx,longn);ZEND_APIintadd_index_null(zval*arg,ulongidx);ZEND_APIintadd_index_bool(zval*arg,ulongidx,intb );ZEND_APIintadd_index_resource (zval*arg,ulongidx,intr );ZEND_APIintadd_index_double (zval*arg,ulongidx,doubled);ZEND_APIintadd_index_string (zval*arg,ulongidx,constchar*str,intduplicate);ZEND_APIintadd_index_stringl (zval*arg,ulongidx,constchar*str,uintlength,intduplicate);ZEND_APIintadd_index_zval(zval*arg,ulongindex,zval*value);//add_next_index_*函数:ZEND_APIintadd_next_index_long(zval*arg,longn );ZEND_APIintadd_next_index_null(zval*arg);ZEND_APIintadd_next_index_bool(zval*arg,intb );ZEND_APIintadd_next_index_resource (zval*arg,intr );ZEND_APIintadd_next_index_double(zval*arg,doubled);ZEND_APIintadd_next_index_string(zval*arg,constchar*str,intduplicate);ZEND_APIintadd_next_index_stringl(zval*arg,constchar*str,uintlength,intduplicate);ZEND_APIintadd_next_index_zval(zval*arg,zval*value);
复制代码 上面能够对照一下数组罕见操纵所对应的宏。
add_next_index_*()- PHP中内核中$arr[]=NULL;add_next_index_null(arr);$arr[]=42;add_next_index_long(arr,42);$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");$arr[]=$var;add_next_index_zval(arr,zval);
复制代码 add_index_*()- PHP中内核中$arr[0]=NULL;add_index_null(arr,0);$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]=$var;add_index_zval(arr,5,zval);
复制代码 add_assoc_*()- PHP中内核中$arr["abc"]=NULL;add_assoc_null(arr,"abc");$arr["def"]=42;add_assoc_long(arr,"def",42);$arr["ghi"]=true;add_assoc_bool(arr,"ghi",1);$arr["jkl"]=3.14add_assoc_double(arr,"jkl",3.14);$arr["mno"]="foo"add_assoc_string(arr,"mno","foo",1");$arr["pqr"]=$var;add_assoc_zval(arr,"pqr",zval);
复制代码 一个完全的实例
上面在PHP中界说一个函数,并在个中利用数组。然厥后看在内核中怎样完成。
- [/code]
- 内核中完成:[code]PHP_FUNCTION(array_test){char*mystr;zval*mysubarray;array_init(return_value);add_index_long(return_value,42,123);add_next_index_string(return_value,"test",1);add_next_index_stringl(return_value,"test_stringl",10,1);mystr=estrdup("FortyFive");add_next_index_string(return_value,mystr,0);add_assoc_double(return_value,"double",3.14);ALLOC_INIT_ZVAL(mysubarray);array_init(mysubarray);add_next_index_string(mysubarray,"hello",1);add_assoc_zval(return_value,"subarray",mysubarray);}
复制代码 你大概会疑问下面代码中的变量return_value在那里界说的。上面将PHP_FUNCTION睁开,你就分明了。- zif_array_test(intht,zval*return_value,zval**return_value_ptr,zval*this_ptr,intreturn_value_usedTSRMLS_DC);
复制代码 没错,实践上每一个函数都有一个默许的前往值return_value。在利用RETVAL_*()、RETURN_*()作为函数前往值时,仅仅是修正return_value。
熟悉HTML/CSS/JS等网页基本元素,完成阶段可自行制作完整的网页,对元素属性达到熟悉程度 |
|