如何在 PHP 中安全有效地引用 $_SERVER['DOCUMENT_ROOT']
How to reference $_SERVER['DOCUMENT_ROOT'] safely and efficiently in PHP
为了避免使用超全局变量,我似乎必须使用这样的东西:
$doc_root = filter_input(INPUT_SERVER, 'DOCUMENT_ROOT');
获取文档根目录。但是如果没有指定过滤器,这只是 FILTER_UNSAFE_RAW
...要使用什么过滤器,是否有预定义的路径过滤器,或者我是否需要使用正则表达式制作自己的过滤器。
现在我已经过滤了 $doc_root
是否每次要使用它时都从 $_SERVER
超全局数组中重新过滤?或者,我应该在函数内部声明 global $doc_root
然后使用它(或者实际上引用 $GLOBALS
数组更好吗?)?
使用超全局变量本身就不错。但是您应该避免在代码中深入使用它们,因为这会增加对环境的隐藏依赖性并使代码更难测试。
因此,如果您担心这种隐藏的依赖关系,您应该在前端控制器中获取值并使用它注入到 class 中。或者,如果您使用的是 DI 容器,则可以定义 returns 此值的服务。
使用 filter_input
函数在这里一点帮助都没有——它只是隐藏了超全局访问。
也许更安全的选择确实是使用 __DIR__
常量。
为了避免使用超全局变量,我似乎必须使用这样的东西:
$doc_root = filter_input(INPUT_SERVER, 'DOCUMENT_ROOT');
获取文档根目录。但是如果没有指定过滤器,这只是 FILTER_UNSAFE_RAW
...要使用什么过滤器,是否有预定义的路径过滤器,或者我是否需要使用正则表达式制作自己的过滤器。
现在我已经过滤了 $doc_root
是否每次要使用它时都从 $_SERVER
超全局数组中重新过滤?或者,我应该在函数内部声明 global $doc_root
然后使用它(或者实际上引用 $GLOBALS
数组更好吗?)?
使用超全局变量本身就不错。但是您应该避免在代码中深入使用它们,因为这会增加对环境的隐藏依赖性并使代码更难测试。
因此,如果您担心这种隐藏的依赖关系,您应该在前端控制器中获取值并使用它注入到 class 中。或者,如果您使用的是 DI 容器,则可以定义 returns 此值的服务。
使用 filter_input
函数在这里一点帮助都没有——它只是隐藏了超全局访问。
也许更安全的选择确实是使用 __DIR__
常量。