vGhost
Новичок
Пытаюсь создать класс в процессе выполнения процедуры, но не очень получается
код такой:
Немного пояснений:
php_printf("\n\n %s\n %s\n %d \n\n", rVariable->obj_qcn, rVariable->obj_lqcn, strlen(rVariable->obj_qcn));
вот что выводит в консоль и что следовательно находится в выше выведенных переменных:
Delphi\Vcl\Forms\TForm
delphi\vcl\forms\tform
22
т.е. с именами всё нормально.
Далее строка:
php_printf("\n\n %s\n \n\n", e.name);
И вот тут происходит не понятная мне магия! Предыдущая инструкция выведет:
Del
Куда делось остальное и почему?
Соответственно объект создаётся таким:
А по завершению работы скрипта ещё сегфолт.
Если класс был создан в MINIT секции, то никаких сегфолтов, а результат выполнения данного кода будет:
Upd:
Если вместо
INIT_CLASS_ENTRY(e, rVariable->obj_qcn, NULL);
захардкодить имя класса вот так:
INIT_CLASS_ENTRY(e, "Delphi\\Vcl\\Forms\\TForm", NULL);
То результат будет такой (но уже без сегфолтов):
Объясните новичку, что не так?
код такой:
Код:
php_printf("\n\n %s\n %s\n %d \n\n", rVariable->obj_qcn, rVariable->obj_lqcn, strlen(rVariable->obj_qcn));
// ce_array - это CG(class_table)
found = zend_hash_find(ce_array, rVariable->obj_lqcn, strlen(rVariable->obj_lqcn) + 1, (void **)&fce);
if (found == FAILURE) {
INIT_CLASS_ENTRY(e, rVariable->obj_qcn, NULL);
php_printf("\n\n %s\n \n\n", e.name);
ce = zend_register_internal_class_ex(&e, c2dw_class_entry, NULL TSRMLS_CC);
zend_hash_update(ce_array, rVariable->obj_lqcn, strlen(rVariable->obj_lqcn) + 1, &ce, sizeof(zend_class_entry *), NULL);
} else {
ce = *fce;
}
if(object_init_ex(return_value, ce) != SUCCESS) {
zend_error(E_ERROR, "Error creating %s object instance", ce->name);
} else {
add_property_long(return_value, "self", rVariable->obj_id );
add_property_string(return_value, "class", rVariable->obj_qcn, 1);
add_property_string(return_value, "name", rVariable->obj_name, 1);
}
php_printf("\n\n %s\n %s\n %d \n\n", rVariable->obj_qcn, rVariable->obj_lqcn, strlen(rVariable->obj_qcn));
вот что выводит в консоль и что следовательно находится в выше выведенных переменных:
Delphi\Vcl\Forms\TForm
delphi\vcl\forms\tform
22
т.е. с именами всё нормально.
Далее строка:
php_printf("\n\n %s\n \n\n", e.name);
И вот тут происходит не понятная мне магия! Предыдущая инструкция выведет:
Del
Куда делось остальное и почему?
Соответственно объект создаётся таким:
Код:
Del Object
(
[self] => 12345
[class] => Delphi\Vcl\Forms\TForm
[name] => trololo
)
Если класс был создан в MINIT секции, то никаких сегфолтов, а результат выполнения данного кода будет:
Код:
Delphi\Vcl\Forms\TForm Object
(
[self] => 12345
[class] => Delphi\Vcl\Forms\TForm
[name] => trololo
)
Upd:
Если вместо
INIT_CLASS_ENTRY(e, rVariable->obj_qcn, NULL);
захардкодить имя класса вот так:
INIT_CLASS_ENTRY(e, "Delphi\\Vcl\\Forms\\TForm", NULL);
То результат будет такой (но уже без сегфолтов):
Код:
Т Object
(
[self] => 12345
[class] => Delphi\Vcl\Forms\TForm
[name] => trololo
)
Объясните новичку, что не так?
Последнее редактирование: