Задать вопрос
@dds

Проблема с дублированием свойств в классе созданом в С-расширении?

Всем привет,


Я только недавно начал заниматься разработкой расширений под 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);


возвращает мне правильное значение, переданное в конструктор, но почему происходит дублирование полей я не понимаю


Может мне кто-то объяснить где у меня проблема? может вообще не стоит при создании класса добавлять ему поля? а инициализировать их все в конструкторе?
  • Вопрос задан
  • 2851 просмотр
Подписаться 2 Оценить Комментировать
Решения вопроса 1
@dds Автор вопроса
После недельного отдыха от задачи нашел ошибку. В общем как я и думал, сама ошибка очень глупая ).
При создании класа я использовал:
sizeof("category")-1


а при чтении/обновлении:
sizeof("category")


поэтому и получались 2 разные переменные.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы