zend_object *new_object;
zend_object_handle handle = Z_OBJ_HANDLE_P(zobject);
+ /* assume that create isn't overwritten, so when clone depends on the
+ * overwritten one then it must itself be overwritten */
old_object = zend_objects_get_address(zobject TSRMLS_CC);
retval = zend_objects_new(&new_object, old_object->ce TSRMLS_CC);
ALLOC_HASHTABLE(new_object->properties);
zend_hash_init(new_object->properties, 0, NULL, ZVAL_PTR_DTOR, 0);
- zend_hash_copy(new_object->properties, old_object->properties, (copy_ctor_func_t) zval_add_ref, (void *) NULL /* Not used anymore */, sizeof(zval *));
if (old_object->ce->clone) {
zval *old_obj;
zval *clone_func_name;
zval *retval_ptr;
HashTable symbol_table;
+ zend_class_entry *ce = old_object->ce;
+
+ zend_hash_copy(new_object->properties, &ce->default_properties, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
MAKE_STD_ZVAL(new_obj);
new_obj->type = IS_OBJECT;
zval_ptr_dtor(&new_obj);
zval_ptr_dtor(&clone_func_name);
zval_ptr_dtor(&retval_ptr);
+ } else {
+ zend_hash_copy(new_object->properties, old_object->properties, (copy_ctor_func_t) zval_add_ref, (void *) NULL /* Not used anymore */, sizeof(zval *));
}
return retval;
--FILE--
<?php
class base {
- private $p1 = 1;
- protected $p2 = 2;
- public $p3;
+ protected $p1 = 'base:1';
+ public $p2 = 'base:2';
+ public $p3 = 'base:3';
+ public $p4 = 'base:4';
+ public $p5 = 'base:5';
+ private $p6 = 'base:6';
public function __clone() {
}
};
-class test {
- public $p1 = 4;
- protected $p4 = 5;
- public $p5;
+class test extends base {
+ public $p1 = 'test:1';
+ public $p3 = 'test:3';
+ public $p4 = 'test:4';
+ public $p5 = 'test:5';
public function __clone() {
+ $this->p5 = 'clone:5';
}
}
$obj = new test;
-$obj->p2 = 'A';
-$obj->p3 = 'B';
+$obj->p4 = 'A';
$copy = $obj->__clone();
-$copy->p3 = 'C';
echo "Object\n";
print_r($obj);
echo "Clown\n";
Object
test Object
(
- [p1] => 4
- [p4:protected] => 5
- [p5] =>
- [p2] => A
- [p3] => B
+ [p1] => test:1
+ [p3] => test:3
+ [p4] => A
+ [p5] => test:5
+ [p1:protected] => base:1
+ [p2] => base:2
+ [p6:private] => base:6
)
Clown
test Object
(
- [p1] => 4
- [p4:protected] => 5
- [p5] =>
- [p1:private] => 1
- [p2] => A
- [p3] => C
+ [p1] => test:1
+ [p3] => test:3
+ [p4] => test:4
+ [p5] => clone:5
+ [p1:protected] => base:1
+ [p2] => base:2
+ [p6:private] => base:6
)
Done