PHP路由-“清理”包含

lrpiutwd  于 2023-04-19  发布在  PHP
关注(0)|答案(1)|浏览(116)

我有一个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路由器的动态解决方案。
如果任何人有类似的问题之前或知道一个很好的解决方案,这将是非常感谢。

zkure5ic

zkure5ic1#

我不知道你对包含有什么担心。你包含的任何东西都像运行脚本的一部分一样运行。函数不能看到全局变量,除非你用global关键字专门注入一个变量(除了“super globals”)。
如果您的问题是您的路由代码正在更改“超级”全局变量,那么问题就变成了--为什么他们这样做只是为了提供路由?
许多项目都采用Symfony Http Foundation组件来 Package HTTP协议中涉及的所有重要的超级全局变量,这是提供隔离的一种方式。鉴于许多php项目广泛采用此组件,我强烈建议认真研究它。
就像

use Symfony\Component\HttpFoundation\Request;
$request = Request::createFromGlobals();

为了防止函数的名称冲突,只需要使用php命名空间。

namespace yourname {
   function foo() {
       echo "yourname foo";
   }

   // rest of your functions
}

给他们打电话:

yourname/foo();

相关问题