]> granicus.if.org Git - php/commitdiff
Fix scope_is_known() for class constants
authorNikita Popov <nikic@php.net>
Thu, 21 May 2015 19:07:05 +0000 (21:07 +0200)
committerNikita Popov <nikic@php.net>
Thu, 21 May 2015 19:07:05 +0000 (21:07 +0200)
Here the active_op_array is still the surrounding file, but we
do know the scope.

Zend/tests/bug69676.phpt [new file with mode: 0644]
Zend/zend_compile.c

diff --git a/Zend/tests/bug69676.phpt b/Zend/tests/bug69676.phpt
new file mode 100644 (file)
index 0000000..54b9d40
--- /dev/null
@@ -0,0 +1,19 @@
+--TEST--
+Bug #69676: Resolution of self::FOO in class constants not correct
+--FILE--
+<?php
+class A {
+       const myConst = "const in A";
+       const myDynConst = self::myConst;
+}
+
+class B extends A {
+       const myConst = "const in B";
+}
+
+var_dump(B::myDynConst);
+var_dump(A::myDynConst);
+?>
+--EXPECT--
+string(10) "const in A"
+string(10) "const in A"
index 78f8ae3207b36e0bb90d11a08f1e545d3ac6ebcd..5647523f36c995186d948d5a1e8d349d6814080d 100644 (file)
@@ -1325,14 +1325,10 @@ static inline zend_bool zend_is_scope_known() /* {{{ */
                return 0;
        }
 
-       if (!CG(active_op_array)->function_name) {
-               /* A file/eval will be run in the including/eval'ing scope */
-               return 0;
-       }
-
        if (!CG(active_class_entry)) {
-               /* Not being in a scope is a known scope */
-               return 1;
+               /* The scope is known if we're in a free function (no scope), but not if we're in
+                * a file/eval (which inherits including/eval'ing scope). */
+               return CG(active_op_array)->function_name != NULL;
        }
 
        /* For traits self etc refers to the using class, not the trait itself */