]> 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:07 +0000 (09:27 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 26 Apr 2005 09:27:07 +0000 (09:27 +0000)
NEWS
Zend/tests/bug30702.phpt [new file with mode: 0644]
Zend/zend_API.c

diff --git a/NEWS b/NEWS
index 43f40393f338f1901ec2347c375db1681cfa5829..ff4a6fa36eee4b6516f6eecbe7aecf36a9f99ee6 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -52,6 +52,8 @@ PHP                                                                        NEWS
 - Fixed bug #31363 (broken non-blocking flock()). ian at snork dot net
 - Fixed bug #30833 (array_count_values() modifying input array). (Tony)
 - Fixed bug #30819 (Better support for LDAP SASL bind). (Jani)
+- Fixed bug #30702 (cannot initialize class variable from class constant).
+  (Dmitry)
 - Fixed bug #29944 (Function defined in switch, crashes). (Dmitry)
 - Fixed bug #29583 (crash when echoing a COM object). (M.Sisolak, Wez)
 - Fixed bug #28839 (SIGSEGV in interactive mode (php -a)).
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 2e60c59db9dca891b6b9f84a6b734cd7b60f71d2..24bf8473c5b037aa9c7aa5d8fb9cdbfc25c538a6 100644 (file)
@@ -690,8 +690,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;
        }
 }