Всем привет,
Я только недавно начал заниматься разработкой расширений под PHP и не могу понять почему происходит дублирование свойств в классе созданом в расширении. При создании класса я делаю так:
STOPWATCH_INIT_CLASS(StopwatchEventNew) {
STOPWATCH_REGISTER_CLASS(Symfony\\Component\\Stopwatch, StopwatchEventNew, event, stopwatch_event_method_entry, 0);
zend_declare_property_string(stopwatch_event_ce, "category", sizeof("category")-1, "", ZEND_ACC_PUBLIC TSRMLS_CC);
zend_declare_property_null(stopwatch_event_ce, "started", sizeof("started")-1, ZEND_ACC_PUBLIC TSRMLS_CC);
zend_declare_property_null(stopwatch_event_ce, "periods", sizeof("periods")-1, ZEND_ACC_PRIVATE TSRMLS_CC);
zend_declare_property_double(stopwatch_event_ce, "origin", sizeof("origin")-1, 0, ZEND_ACC_PRIVATE TSRMLS_CC);
return SUCCESS;
}
#define STOPWATCH_INIT_CLASS(name) int stopwatch_ ##name## _init(INIT_FUNC_ARGS)
#define STOPWATCH_REGISTER_CLASS(ns, class_name, name, methods, flags) \
{ \
zend_class_entry ce; \
memset(&ce, 0, sizeof(zend_class_entry)); \
INIT_NS_CLASS_ENTRY(ce, #ns, #class_name, methods); \
stopwatch_ ##name## _ce = zend_register_internal_class(&ce TSRMLS_CC); \
stopwatch_ ##name## _ce->ce_flags |= flags; \
}
Если я делаю var_dump для инстанса этого класса, то мне показывает 4 поля класса, но когда я добавляю имплементацию конструктора:
PHP_METHOD(StopwatchEventNew, __construct)
{
zend_class_entry *ce;
double origin;
char *category;
int category_len;
zval *started, *periods;
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "d|s", &origin, &category, &category_len) == FAILURE)
{
return;
}
ce = Z_OBJCE_P(this_ptr);
zend_update_property_string(ce, this_ptr, "category", sizeof("category"), category TSRMLS_CC);
zend_update_property_double(ce, this_ptr, "origin", sizeof("origin"), formatTime(origin TSRMLS_CC) TSRMLS_CC);
MAKE_STD_ZVAL(started);
MAKE_STD_ZVAL(periods);
array_init(started);
array_init(periods);
zend_update_property(ce, this_ptr, "started", sizeof("started"), started TSRMLS_CC);
zend_update_property(ce, this_ptr, "periods", sizeof("periods"), periods TSRMLS_CC);
}
то при var_dump нового инстанса мне показывает 8 полей, где 4 с дефолтными значениями и 4 с обновленными. Когда я делаю гетер на любое поле, то
val = zend_read_property(ce, this_ptr, "category", sizeof("category"), FALSE TSRMLS_CC);
возвращает мне правильное значение, переданное в конструктор, но почему происходит дублирование полей я не понимаю
Может мне кто-то объяснить где у меня проблема? может вообще не стоит при создании класса добавлять ему поля? а инициализировать их все в конструкторе?