summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2015-05-21 21:07:05 +0200
committerNikita Popov <nikic@php.net>2015-05-21 21:07:05 +0200
commit3dba00bc31eb92ef1187f6dd78f2c7bb3c003710 (patch)
tree01938ec87686027254e576516cfbea154ecef32d
parentf186d4b8b19981efd61f629a856e7bdf6ea50155 (diff)
downloadphp-git-3dba00bc31eb92ef1187f6dd78f2c7bb3c003710.tar.gz
Fix scope_is_known() for class constants
Here the active_op_array is still the surrounding file, but we do know the scope.
-rw-r--r--Zend/tests/bug69676.phpt19
-rw-r--r--Zend/zend_compile.c10
2 files changed, 22 insertions, 7 deletions
diff --git a/Zend/tests/bug69676.phpt b/Zend/tests/bug69676.phpt
new file mode 100644
index 0000000000..54b9d40047
--- /dev/null
+++ b/Zend/tests/bug69676.phpt
@@ -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"
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 78f8ae3207..5647523f36 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -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 */