Here the active_op_array is still the surrounding file, but we
do know the scope.
--- /dev/null
+--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"
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 */