php数组问题 本帖最后由 duanchengfeng 于 2013-02-18 15:04:54 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 请版主回答得详细点,小弟初学者,php的数组是在堆中还是在栈中 PHP中怎么会无堆无栈呢???所有程序都是在内存中玩的。在内存中那么就会有地址的分配了。PHP中基本数据类型是放在栈区,而复合数据类型是放在堆区的。数组是复合数据类型,所以是放在堆区。 php中所有变量都是由叫zval的结构体实现数组变量创建之后,产生一个zval结构体,其中value存放变量值,type标志变量的类型typedef struct _zval_struct zval; struct _zval_struct { zvalue_value value; /* value */ unsigned char type; /* active type */ unsigned char is_ref; short refcount; };value元素是一个_zvalue_value的联合体typedef union _zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { char *val; int len; } str; HashTable *ht; /* hash table value */ struct { zend_class_entry *ce; HashTable *properties; } obj; } zvalue_value;如果变量类型是数组,那么数组值变存放在_zvalue_value的*ht中,这是一个HashTable结构体typedef struct _hashtable { uint nTableSize; uint nTableMask; uint nNumOfElements; ulong nNextFreeElement; Bucket *pInternalPointer; /* Used for element traversal */ Bucket *pListHead; Bucket *pListTail; Bucket **arBuckets; dtor_func_t pDestructor; zend_bool persistent; unsigned char nApplyCount; zend_bool bApplyProtection; #if ZEND_DEBUG int inconsistent; #endif } HashTable; 其中bucket是一个双向链表,用来存放数组的每个元素typedef struct bucket { ulong h; /* Used for numeric indexing */ uint nKeyLength; void *pData; void *pDataPtr; struct bucket *pListNext; struct bucket *pListLast; struct bucket *pNext; struct bucket *pLast; char *arKey; } Bucket; 楼上两位有点自作多情了楼主问的是php,而不是实现php伪处理器的c++如果学习php需要研究其底层实现的话,那么是否使用C++也需要精通汇编呢?如果哪天php用java重写,是否也需要也去学习java呢? 你可以这样简单的理解。 栈区是值传递, 堆区是引用传递。 就是指针PHP的数组是在栈区。 传值是值传递JS的数组是存在堆区。 传值是引用传递。 mysql在操作表的时候,表是否被锁定 Smarty中函数的参数能不能为另一个函数的结果? 图片上传,并存到数据库。。。 一个小问题. 为什么\n不能起到换行的作用?是不是windows环境的缘故? 关于Apache+php5.0+MySql 运行时错误 请问后台返回怎么保留现场? mysqlfront中填加一个用户,但是连不上mysql啊??? preg_match函数无法返回数组!! SOS: 请教怎么在百度统计里标志受访页面是微信打开? 大家看看我这句话那里出错了? 请教个基础的mysql查询问题
数组变量创建之后,产生一个zval结构体,其中value存放变量值,type标志变量的类型
typedef struct _zval_struct zval;
struct _zval_struct {
zvalue_value value; /* value */
unsigned char type; /* active type */
unsigned char is_ref;
short refcount;
};
value元素是一个_zvalue_value的联合体
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
char *val;
int len;
} str;
HashTable *ht; /* hash table value */
struct {
zend_class_entry *ce;
HashTable *properties;
} obj;
} zvalue_value;
如果变量类型是数组,那么数组值变存放在_zvalue_value的*ht中,这是一个HashTable结构体
typedef struct _hashtable {
uint nTableSize;
uint nTableMask;
uint nNumOfElements;
ulong nNextFreeElement;
Bucket *pInternalPointer; /* Used for element traversal */
Bucket *pListHead;
Bucket *pListTail;
Bucket **arBuckets;
dtor_func_t pDestructor;
zend_bool persistent;
unsigned char nApplyCount;
zend_bool bApplyProtection;
#if ZEND_DEBUG
int inconsistent;
#endif
} HashTable; 其中bucket是一个双向链表,用来存放数组的每个元素
typedef struct bucket {
ulong h; /* Used for numeric indexing */
uint nKeyLength;
void *pData;
void *pDataPtr;
struct bucket *pListNext;
struct bucket *pListLast;
struct bucket *pNext;
struct bucket *pLast;
char *arKey;
} Bucket;
楼主问的是php,而不是实现php伪处理器的c++
如果学习php需要研究其底层实现的话,那么是否使用C++也需要精通汇编呢?
如果哪天php用java重写,是否也需要也去学习java呢?
你可以这样简单的理解。 栈区是值传递, 堆区是引用传递。 就是指针
PHP的数组是在栈区。 传值是值传递
JS的数组是存在堆区。 传值是引用传递。