int le_conn; //資源表示定義成全局,在模塊初始化階段,zend會給每一個資源分配惟一的idphp
zend_class_entry *spread_class_entry; //全局定義類mysql
static zend_function_entry spread_class_functions[] = { //類方法能夠直接映射到函數,這樣既能夠直接訪問函數也能夠面向對象,mysqli應該就是這種方式sql
ZEND_MALIAS(Spread, __construct, spread_constructor, arginfo_spread___construct, ZEND_ACC_PUBLIC)less
PHP_ME_MAPPING(connect, spread_connect, arginfo_spread_oop_connect, 0)函數
PHP_ME_MAPPING(disconnect, spread_disconnect, arginfo_spread_oop_disconnect, 0)oop
PHP_ME_MAPPING(join, spread_join, arginfo_spread_oop_join, 0)this
PHP_ME_MAPPING(leave, spread_leave, arginfo_spread_oop_join, 0)spa
PHP_ME_MAPPING(receive, spread_receive, arginfo_spread_oop_receive, 0)指針
PHP_ME_MAPPING(multicast, spread_multicast, arginfo_spread_oop_multicast, 0)orm
PHP_FE_END
};
//定義宏爲類添加常量
#define REGISTER_SPREAD_CLASS_CONST_LONG(const_name, value) \
zend_declare_class_constant_long(spread_class_entry, const_name, sizeof(const_name)-1, (long)value TSRMLS_CC);
PHP_MINIT_FUNCTION(spread) //模塊初始化中定義類
{
zend_class_entry spread_ce;
memcpy(&spread_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
spread_object_handlers.clone_obj = NULL;
INIT_CLASS_ENTRY(spread_ce, "Spread", spread_class_functions);
spread_ce.create_object = spread_object_new;
spread_class_entry = zend_register_internal_class(&spread_ce TSRMLS_CC);
//定義資源
le_conn = zend_register_list_destructors_ex(php_spread_rsr_dtor, NULL, "spread", module_number);
}
ZEND_REGISTER_RESOURCE(return_value, mbox, le_conn); //註冊資源,經過le_conn關聯定義的資源,mbox爲資源變量,資源析構函數php_spread_rsr_dtor參數zend_rsrc_list_entry *rsrc的ptr指針指向mbox。
//更新類屬性
zend_update_property_stringl(spread_class_entry, this, "daemon", sizeof("daemon") - 1, spread_name, spread_name_len TSRMLS_CC);
//直接定義類方法
PHP_METHOD(Spread, spread_constructor)
{
zval *object = getThis(); //獲取當前類對象
zval *groups_array;
//添加屬性
add_property_bool(object, "connected", 0);
add_property_null(object, "daemon");
add_property_null(object, "private_name");
add_property_null(object, "private_group");
MAKE_STD_ZVAL(groups_array);
array_init(groups_array);
add_property_zval(object, "joined_groups", groups_array);
/* add_prop_zval increments the refcount, useless here */
zval_ptr_dtor(&groups_array);
}
retval.handle = zend_objects_store_put(intern, NULL, (zend_objects_free_object_storage_t) spread_object_free_storage, NULL TSRMLS_CC); //將資源放入資源池,返回索引
(ze_spread_object *) zend_object_store_get_object(object TSRMLS_CC); //獲取對象池中bucket中的對象,傳入值爲對象