@@ -86,32 +86,86 @@ static void php_ListNode_init_globals(zend_ListNode_globals *ListNode_globals)
86
86
*/
87
87
/* }}} */
88
88
89
- zend_class_entry *listnode_ce ;
89
+ zend_object_handlers ListNode_object_handlers ;
90
90
91
- ZEND_METHOD (ListNode, __construct)
92
- {
91
+ struct ListNode_object {
92
+ zend_object std;
93
+ CListNode *listnode;
94
+ };
93
95
94
- }
95
96
97
+ zend_class_entry* listnode_ce;
98
+
99
+ PHP_METHOD (ListNode,__construct)
100
+ {
101
+ CListNode* ln = CListNode::create ();
102
+ zval* thisptr = getThis ();
103
+ ListNode_object* ln_obj = (ListNode_object*) zend_object_store_get_object (thisptr TSRMLS_CC);
104
+ ln_obj->listnode = ln;
105
+
106
+ // 在与c++配合中 定义类属性 在 __construct 中定义
107
+ zend_update_property_string (listnode_ce,thisptr," p1" ,strlen (" p1" )," bbb" TSRMLS_CC);
108
+ zend_declare_class_constant_string (listnode_ce," AAA" ,strlen (" AAA" )," bbb" TSRMLS_CC);
109
+ }
96
110
static zend_function_entry listnode_methods[]=
97
111
{
98
- ZEND_ME (ListNode,__construct,NULL ,ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
99
- {NULL , NULL , NULL }
112
+ ZEND_ME (ListNode,__construct,NULL ,ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
113
+ {NULL ,NULL ,NULL }
100
114
};
101
115
116
+
117
+
118
+
119
+ void free_listnode_object (void * obj TSRMLS_DC)
120
+ {
121
+ ListNode_object* listnode_obj = (ListNode_object*)obj;
122
+ delete listnode_obj->listnode ;
123
+
124
+ zend_hash_destroy (listnode_obj->std .properties );
125
+ FREE_HASHTABLE (listnode_obj->std .properties );
126
+
127
+ efree (listnode_obj);
128
+ }
129
+
130
+ zend_object_value create_listnode_object (zend_class_entry* class_entry TSRMLS_DC)
131
+ {
132
+ // zval *tmp;
133
+ zend_object_value retval;
134
+ zval *tmp;
135
+ ListNode_object* listnode_object=(ListNode_object*)emalloc (sizeof (ListNode_object));
136
+ memset (listnode_object,0 ,sizeof (ListNode_object));
137
+ listnode_object->std .ce = class_entry;
138
+
139
+ ALLOC_HASHTABLE (listnode_object->std .properties );
140
+ zend_hash_init (listnode_object->std .properties , 0 , NULL , ZVAL_PTR_DTOR, 0 );// 不持久 ZVAL_PTR_DTOR销毁函数 引用计数减一 自动销毁
141
+ zend_hash_copy (listnode_object->std .properties , &class_entry->properties_info ,(copy_ctor_func_t )zval_add_ref, (void *)&tmp, sizeof (zval *));// &class_entry->properties_info 即为 zend_declare_property系列函数 定义类属性时修改的hashtable 这里从他复制初值 倒数第2个参数为兼容之前的 这里用NULL
142
+
143
+ retval.handle = zend_objects_store_put (listnode_object, NULL ,free_listnode_object, NULL TSRMLS_CC);
144
+ retval.handlers = &ListNode_object_handlers;
145
+
146
+ return retval;
147
+ }
148
+
102
149
/* {{{ PHP_MINIT_FUNCTION
103
150
*/
104
151
PHP_MINIT_FUNCTION (ListNode)
105
152
{
106
153
/* If you have INI entries, uncomment these lines
107
154
REGISTER_INI_ENTRIES();
108
155
*/
109
- zend_class_entry _listnode_ce;
110
- INIT_CLASS_ENTRY (_listnode_ce, " ListNode" , listnode_methods);
111
-
112
- listnode_ce = zend_register_internal_class (&_listnode_ce TSRMLS_CC);
113
- zend_declare_property_string (listnode_ce, " node_num" , sizeof (" node_num" ), NULL , ZEND_ACC_PUBLIC TSRMLS_CC);
114
- return SUCCESS;
156
+ zend_class_entry ce;
157
+ INIT_CLASS_ENTRY (ce," ListNode" ,listnode_methods);
158
+ listnode_ce = zend_register_internal_class (&ce TSRMLS_CC);
159
+
160
+ listnode_ce->create_object = create_listnode_object;
161
+ // 初始化 ListNode_object_handlers
162
+ memcpy (&ListNode_object_handlers,zend_get_std_object_handlers (),sizeof (zend_object_handlers));
163
+ ListNode_object_handlers.clone_obj = NULL ;
164
+
165
+
166
+ // zend_declare_property_string(listnode_ce,"p1",strlen("p1"),"aaa",ZEND_ACC_PUBLIC TSRMLS_CC);
167
+ // zend_declare_class_constant_string(listnode_ce,"LISTNODE_VER",strlen("LISTNODE_VER"),"1.0" TSRMLS_CC);
168
+ return SUCCESS;
115
169
}
116
170
/* }}} */
117
171
0 commit comments