]> granicus.if.org Git - php/commitdiff
Fixed bug #30702 (cannot initialize class variable from class constant)
authorDmitry Stogov <dmitry@php.net>
Tue, 26 Apr 2005 09:27:28 +0000 (09:27 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 26 Apr 2005 09:27:28 +0000 (09:27 +0000)
Zend/tests/bug30702.phpt [new file with mode: 0644]
Zend/zend_API.c

diff --git a/Zend/tests/bug30702.phpt b/Zend/tests/bug30702.phpt
new file mode 100644 (file)
index 0000000..17e44a3
--- /dev/null
@@ -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)
+}
index 0e9f822e804985fd4d3cb43dd4589a63d93a9c39..6e66cfd288fb2b6ca78b45688bf6116418f9f476 100644 (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)
 {
        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->static_members, (apply_func_arg_t) zval_update_constant, (void *) 1 TSRMLS_CC);
+               *scope = old_scope;
                class_type->constants_updated = 1;
        }
 }