仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 542|回复: 8
打印 上一主题 下一主题

[学习教程] PHP网页编程之数组在PHP内核中的完成

[复制链接]
柔情似水 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:12:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

PHP中界说数组:
  1. [/code]
  2. 在内核中利用宏来完成:
  3. [code]zval*array;array_init(array);add_assoc_string(array,"key","value",1);
复制代码
将上述代码中的宏睁开:
  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);
复制代码
便利的数组宏操纵


内核为我们供应了便利的宏来办理数组。
  1. //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_*()
  1. 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_*()
  1. 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_*()
  1. 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中界说一个函数,并在个中利用数组。然厥后看在内核中怎样完成。

  1. [/code]
  2. 内核中完成:[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睁开,你就分明了。
  1. 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的,有可能代码是争取结果被遨游折腾的认为是代码写错。
若天明 该用户已被删除
5#
发表于 2015-2-10 06:51:25 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
透明 该用户已被删除
6#
发表于 2015-3-1 03:17:17 | 只看该作者
基础有没有对学习php没有太大区别,关键是兴趣。
乐观 该用户已被删除
7#
发表于 2015-3-10 12:42:17 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
爱飞 该用户已被删除
8#
发表于 2015-3-17 07:11:25 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
分手快乐 该用户已被删除
9#
发表于 2015-3-24 02:17:01 | 只看该作者
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 23:31

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表