From: Nikita Popov Date: Thu, 7 May 2015 13:17:37 +0000 (+0200) Subject: Allow self etc in eval / file scope X-Git-Tag: PRE_PHP7_NSAPI_REMOVAL~65^2~2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6ef8ae65a2f8f973d419c193aa4a1e6150f3646a;p=php Allow self etc in eval / file scope This fixes a regression from 16a9bc1ec20533c76ba992bfc64dd69e7b7d9001. Together with the recent closure related changes this should allow all usages of self etc, while previously (in PHP 5) some things like self::class did not work. --- diff --git a/Zend/tests/self_class_const_outside_class.phpt b/Zend/tests/self_class_const_outside_class.phpt index 541f3da381..7a1f989a55 100644 --- a/Zend/tests/self_class_const_outside_class.phpt +++ b/Zend/tests/self_class_const_outside_class.phpt @@ -1,8 +1,10 @@ --TEST-- -Accessing self::FOO outside a class +Accessing self::FOO in a free function --FILE-- --EXPECTF-- Fatal error: Cannot use "self" when no class scope is active in %s on line %d diff --git a/Zend/tests/self_in_eval.phpt b/Zend/tests/self_in_eval.phpt new file mode 100644 index 0000000000..41c2654062 --- /dev/null +++ b/Zend/tests/self_in_eval.phpt @@ -0,0 +1,28 @@ +--TEST-- +self etc. can be used in eval() in a class scope +--FILE-- + +--EXPECT-- +int(1) +int(2) +string(1) "C" +string(1) "C" + diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index a543821415..2606304afb 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1325,6 +1325,11 @@ 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;