Skip to content

Commit 3c6feab

Browse files
committed
make class with c++ class and define properties and const properties
1 parent 0324506 commit 3c6feab

File tree

1 file changed

+66
-12
lines changed

1 file changed

+66
-12
lines changed

ListNode.cc

Lines changed: 66 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -86,32 +86,86 @@ static void php_ListNode_init_globals(zend_ListNode_globals *ListNode_globals)
8686
*/
8787
/* }}} */
8888

89-
zend_class_entry *listnode_ce;
89+
zend_object_handlers ListNode_object_handlers;
9090

91-
ZEND_METHOD(ListNode, __construct)
92-
{
91+
struct ListNode_object{
92+
zend_object std;
93+
CListNode *listnode;
94+
};
9395

94-
}
9596

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+
}
96110
static zend_function_entry listnode_methods[]=
97111
{
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}
100114
};
101115

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+
102149
/* {{{ PHP_MINIT_FUNCTION
103150
*/
104151
PHP_MINIT_FUNCTION(ListNode)
105152
{
106153
/* If you have INI entries, uncomment these lines
107154
REGISTER_INI_ENTRIES();
108155
*/
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;
115169
}
116170
/* }}} */
117171

0 commit comments

Comments
 (0)