我有一个 PHP 路由脚本,像这样:
include_once('routing-functions.php');
// pathMatches was imported from routing-functions.php
if(pathMatches('/blog/*')){
include_once('actual-script.php');
}
我遇到的问题如下:
routing-functions.php
中的函数和全局变量可能与包含的文件发生冲突。此外,我不希望actual-script.php
访问路由器的任何变量。
我正在寻找一种完全擦除 PHP 上下文的方法,以便像直接请求文件一样包含文件,所以执行以下操作不是一个选项,因为它会更改执行
actual-script.php
的上下文/范围:
if(pathMatches('/blog/*')){
$sandbox = function(){
include_once('actual-script.php');
};
$sandbox();
}
此外,向文件发送本地请求(例如使用 cURL)也不是一种选择,因为它对性能有负面影响,我希望它像在
/blog/
URL 下一样运行。
使用 .htaccess 很容易解决问题,但是,我需要一个使用 PHP 路由器的动态解决方案。
如果有人以前遇到过类似问题或知道好的解决方案,将不胜感激。
我不确定您对包容性有何担忧。您包含的任何内容都像运行脚本的一部分一样运行。函数看不到全局变量,除非你用 global 关键字专门将它们注入它。
如果你的问题是你的路由代码正在改变全局状态,那么问题就变成了——为什么他们这样做只是为了提供路由?
许多项目都采用了Symfony Http Foundation 组件来包装 HTTP 协议中涉及的所有重要的超级全局变量,这是您可以提供隔离的一种方式。鉴于许多 php 项目广泛采用此组件,我强烈建议您认真研究它。
就这么简单
use Symfony\Component\HttpFoundation\Request;
$request = Request::createFromGlobals();
至于防止函数的名称冲突,只需使用 php 命名空间即可。
namespace yourname {
function foo() {
echo "yourname foo";
}
// rest of your functions
}
给他们打电话:
yourname/foo();