PHP那个该死的若类型是怎么实现的
打开php代码中Zend.h和Zend_types.h可以看到有如下定义:
typedef union _zvalue_value {
long lval; /* 长整形 */
double dval; /* 双精度 */
struct {
char *val;
int len;
} str; /*字符串*/
HashTable *ht; /*hash表 */
zend_object obj; /*PHP对象存储结构*/
} zvalue_value;
struct _zval_struct {
zvalue_value value; /*值*/
zend_uchar type; /*当前类型*/
zend_uchar is_ref; /*。。。。。。。。。。。。。。看起来是是否被引用了*/
zend_ushort refcount; /*引用计数器*/
};
typedef struct _zval_struct zval;
typedef zval pval;
/*这玩意就是一个句柄表么*/
typedef unsigned int zend_object_handle;
typedef struct _zend_object_handlers zend_object_handlers;
typedef struct _zend_object_value {
zend_object_handle handle;
zend_object_handlers *handlers;
} zend_object_value;
/*对象结构体*/
struct _zend_object_handlers {
/* general object functions */
zend_object_add_ref_t add_ref;
zend_object_del_ref_t del_ref;
zend_object_clone_obj_t clone_obj;
/* individual object functions */
zend_object_read_property_t read_property;
zend_object_write_property_t write_property;
zend_object_read_dimension_t read_dimension;
zend_object_write_dimension_t write_dimension;
zend_object_get_property_ptr_ptr_t get_property_ptr_ptr;
zend_object_get_t get;
zend_object_set_t set;
zend_object_has_property_t has_property;
zend_object_unset_property_t unset_property;
zend_object_has_dimension_t has_dimension;
zend_object_unset_dimension_t unset_dimension;
zend_object_get_properties_t get_properties;
zend_object_get_method_t get_method;
zend_object_call_method_t call_method;
zend_object_get_constructor_t get_constructor;
zend_object_get_class_entry_t get_class_entry;
zend_object_get_class_name_t get_class_name;
zend_object_compare_t compare_objects;
zend_object_cast_t cast_object;
zend_object_count_elements_t count_elements;
zend_object_get_debug_info_t get_debug_info;
zend_object_get_closure_t get_closure;
}
这个结构体里面实现了:长整型,双精度浮点,字符串,hash表,还有对象(zend_object_value)。就是zval和pval两个结构。