]> granicus.if.org Git - php/commitdiff
Allow self etc in eval / file scope
authorNikita Popov <nikic@php.net>
Thu, 7 May 2015 13:17:37 +0000 (15:17 +0200)
committerNikita Popov <nikic@php.net>
Thu, 7 May 2015 13:38:16 +0000 (15:38 +0200)
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.

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

index 541f3da3817c1b3333fa48fa82303a9af6c00b87..7a1f989a55340741ef9e5c0af6c1314769d1e347 100644 (file)
@@ -1,8 +1,10 @@
 --TEST--
-Accessing self::FOO outside a class
+Accessing self::FOO in a free function
 --FILE--
 <?php
-var_dump(self::FOO);
+function test() {
+    var_dump(self::FOO);
+}
 ?>
 --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 (file)
index 0000000..41c2654
--- /dev/null
@@ -0,0 +1,28 @@
+--TEST--
+self etc. can be used in eval() in a class scope
+--FILE--
+<?php
+
+class C {
+    const FOO = 1;
+    private static $bar = 2;
+    public static function f() {
+        eval(<<<'PHP'
+var_dump(self::FOO);
+var_dump(self::$bar);
+var_dump(self::class);
+var_dump(static::class);
+PHP
+        );
+    }
+}
+
+C::f();
+
+?>
+--EXPECT--
+int(1)
+int(2)
+string(1) "C"
+string(1) "C"
+
index a5438214151ee89236cf5d35ddea10e043cd496d..2606304afbdd47883a2fffff52e89991075dc9f3 100644 (file)
@@ -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;