柔情似水 发表于 2015-1-16 22:12:07

PHP网页编程之数组在PHP内核中的完成

《PHP+MYSQLWEB开发(第三版)》号称圣经级,(也许是个不错的选择(声明:作者没给我啥好处费,我也不是书托,隔着大老远,我连他老兄的面都没见过的说-_-)PHP中常常利用数组,PHP的数组壮大,并且速率也快,读写都能够在O(1)内完成,由于它每一个元素的巨细都是分歧的,只需晓得下标,即可以刹时盘算出其对应的元素在内存中的地位,从而间接掏出大概写进。那末内核中数组是怎样完成的呢?
PHP年夜部分功效,都是经由过程HashTable来完成,个中就包含数组。
HashTable即具有双向链表的长处,同时具有能与数据对抗的操纵功能。
<ulclass="dlg"><liclass="dlg_cleareven">PHP中的界说的变量保留在一个标记内外,而这个标记表实在就是一个HashTable,它的每个元素都是一个zval*范例的变量。不但云云,保留用户界说的函数、类、资本等的容器都是以HashTable的情势在内核中完成的。上面分离来看在PHP、内核中怎样界说数组。
数组界说的完成

PHP中界说数组:

在内核中利用宏来完成:
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=NULL;add_index_null(arr,0);$arr=42;add_index_long(arr,1,42);$arr=true;add_index_bool(arr,2,1);$arr=3.14;add_index_double(arr,3,3.14);$arr=foo;        add_index_string(arr,4,"foo",1);$arr=$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中界说一个函数,并在个中利用数组。然厥后看在内核中怎样完成。



内核中完成: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等网页基本元素,完成阶段可自行制作完整的网页,对元素属性达到熟悉程度

因胸联盟 发表于 2015-1-18 22:38:57

不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。

只想知道 发表于 2015-1-26 16:08:56

说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。

海妖 发表于 2015-2-4 20:15:46

写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。

若天明 发表于 2015-2-10 06:51:25

不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。

透明 发表于 2015-3-1 03:17:17

基础有没有对学习php没有太大区别,关键是兴趣。

乐观 发表于 2015-3-10 12:42:17

php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)

爱飞 发表于 2015-3-17 07:11:25

因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax

分手快乐 发表于 2015-3-24 02:17:01

这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
页: [1]
查看完整版本: PHP网页编程之数组在PHP内核中的完成