}
ce->parent = parent_ce;
+ /* Transfer parent custom callbacks, if any */
+ if (!ce->serialize) {
+ ce->serialize = parent_ce->serialize;
+ }
+ if (!ce->unserialize) {
+ ce->unserialize = parent_ce->unserialize;
+ }
/* Inherit interfaces */
zend_do_inherit_interfaces(ce, parent_ce TSRMLS_CC);
- /* Copy serialize/unserialize callbacks */
- ce->serialize = parent_ce->serialize;
- ce->unserialize = parent_ce->unserialize;
-
/* Inherit properties */
zend_hash_merge(&ce->default_properties, &parent_ce->default_properties, (void (*)(void *)) zval_add_ref, NULL, sizeof(zval *), 0);
if (parent_ce->type != ce->type) {
/* {{{ zend_implement_serializable */
static int zend_implement_serializable(zend_class_entry *interface, zend_class_entry *class_type TSRMLS_DC)
{
- if ((class_type->serialize && class_type->serialize != zend_user_serialize)
- || (class_type->unserialize && class_type->unserialize != zend_user_unserialize)
- ) {
+ if (class_type->parent
+ && (class_type->parent->serialize || class_type->parent->unserialize)
+ && !instanceof_function_ex(class_type->parent, zend_ce_serializable, 1 TSRMLS_CC)) {
return FAILURE;
}
- class_type->serialize = zend_user_serialize;
- class_type->unserialize = zend_user_unserialize;
+ if (!class_type->serialize) {
+ class_type->serialize = zend_user_serialize;
+ }
+ if (!class_type->unserialize) {
+ class_type->unserialize = zend_user_unserialize;
+ }
return SUCCESS;
}
/* }}}*/