Fixed bug #30702 (cannot initialize class variable from class constant)

This commit is contained in:
Dmitry Stogov 2005-04-26 09:27:28 +00:00
parent 694f7a9e90
commit 5f600cdf57
2 changed files with 44 additions and 0 deletions

39
Zend/tests/bug30702.phpt Normal file
View File

@ -0,0 +1,39 @@
--TEST--
Bug #30702 cannot initialize class variable from class constant
--FILE--
<?php
class foo {
const C1=1;
}
class bar extends foo {
const C2=2;
public $c1=bar::C1;
public $c2=bar::C2;
public $c3=self::C1;
public $c4=self::C2;
public $c5=foo::C1;
public $c6=parent::C1;
}
$x= new bar();
var_dump($x);
?>
--EXPECT--
object(bar)#1 (6) {
["c1"]=>
int(1)
["c2"]=>
int(2)
["c3"]=>
int(1)
["c4"]=>
int(2)
["c5"]=>
int(1)
["c6"]=>
int(1)
}

View File

@ -712,8 +712,13 @@ ZEND_API void zend_merge_properties(zval *obj, HashTable *properties, int destro
ZEND_API void zend_update_class_constants(zend_class_entry *class_type TSRMLS_DC) ZEND_API void zend_update_class_constants(zend_class_entry *class_type TSRMLS_DC)
{ {
if (!class_type->constants_updated) { if (!class_type->constants_updated) {
zend_class_entry **scope = EG(in_execution)?&EG(scope):&CG(active_class_entry);
zend_class_entry *old_scope = *scope;
*scope = class_type;
zend_hash_apply_with_argument(&class_type->default_properties, (apply_func_arg_t) zval_update_constant, (void *) 1 TSRMLS_CC); zend_hash_apply_with_argument(&class_type->default_properties, (apply_func_arg_t) zval_update_constant, (void *) 1 TSRMLS_CC);
zend_hash_apply_with_argument(class_type->static_members, (apply_func_arg_t) zval_update_constant, (void *) 1 TSRMLS_CC); zend_hash_apply_with_argument(class_type->static_members, (apply_func_arg_t) zval_update_constant, (void *) 1 TSRMLS_CC);
*scope = old_scope;
class_type->constants_updated = 1; class_type->constants_updated = 1;
} }
} }