gpt4 book ai didi

php - 使用 eval() 和 include() 的命名空间无法按预期工作

转载 作者:可可西里 更新时间:2023-11-01 13:52:38 24 4
gpt4 key购买 nike

我只是在胡闹,我遇到了这个:


不起作用

<?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 Fatal error: Cannot redeclare a_func() (previously declared in data:text/plain, <?php function a_func(){echo "hi";}:1) in data:text/plain, <?php function a_func(){echo "bye";} on line 1

不起作用

<?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 Fatal error: Cannot redeclare a_func() (previously declared in C:\path\test.php(3) : eval()'d code:1) in C:\path\test.php(7) : eval()'d code on line 1

有效

<?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 使编译器处理它们的输入,就好像在这两种情况下它来自一个单独的文件。

这意味着您在设置代码中的 namespace 声明不会传输到来自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();
}

关于php - 使用 eval() 和 include() 的命名空间无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36945327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com