带有eval()和include()的名称间距无法按预期工作


Namespacing with eval() and include() does not work as expected

我只是在闲逛,我遇到了这个:


不工作

<?php
namespace first{
    include 'data:text/plain, <?php function a_func(){echo "hi";}';
    a_func();
}
namespace second{
    include 'data:text/plain, <?php function a_func(){echo "bye";}';
    a_func();
}

〔29-Apr-2016 14:12:42 America/New_York〕PHP致命错误:无法在数据中重新声明a_func()(以前在数据中声明:text/plain,<?PHP函数a_funce(){echo"hi";}:1);?第1行上的php函数a_func(){echo"bye";}

不工作

<?php
namespace first{
    eval('function a_func(){echo "hi";}');
    a_func();
}
namespace second{
    eval('function a_func(){echo "bye";}');
    a_func();
}

〔29-Apr-2016 14:19:21 America/New_York〕PHP致命错误:无法在第1行的C:''path''test.PHP(7):eval()代码中重新声明a_func()

工作

<?php
namespace first{
    function a_func(){echo "hi";}
    a_func();
}
namespace second{
    function a_func(){echo "bye";}
    a_func();
}

在PHP 5.6.20和7.0.5 中测试


这是个虫子吗?特色是否有目的地实施?


额外学分:如何使include()eval()工作?

includeeval使编译器在这两种情况下都像处理来自单独文件的输入一样处理它们的输入。

这意味着设置代码中的命名空间声明不会转移到来自include/eval的代码,并且在那里定义的函数是在全局命名空间中定义的。您可以使用轻松验证这一点

<?php
namespace outer;
eval('function func(){}');
var_dump(function_exists(''outer'func'));    // false
var_dump(function_exists(''func'));          // true

要获得预期的行为,必须在被拉入的代码中包含命名空间声明:

<?php
namespace first{
    include 'data:text/plain,<?php namespace first; function a_func(){echo "hi";}';
    a_func();
}
namespace second{
    include 'data:text/plain,<?php namespace second; function a_func(){echo "bye";}';
    a_func();
}

<?php
namespace first{
    eval('namespace first; function a_func(){echo "hi";}');
    a_func();
}
namespace second{
    eval('namespace second; function a_func(){echo "bye";}');
    a_func();
}