diff options
author | Nikita Popov <nikic@php.net> | 2015-05-21 21:07:05 +0200 |
---|---|---|
committer | Nikita Popov <nikic@php.net> | 2015-05-21 21:07:05 +0200 |
commit | 3dba00bc31eb92ef1187f6dd78f2c7bb3c003710 (patch) | |
tree | 01938ec87686027254e576516cfbea154ecef32d | |
parent | f186d4b8b19981efd61f629a856e7bdf6ea50155 (diff) | |
download | php-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.phpt | 19 | ||||
-rw-r--r-- | Zend/zend_compile.c | 10 |
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 */ |