为了保持URL在版本控制的项目中工作,我一直在使用$ _SERVER ['DOCUMENT_ROOT'].问题是,我在一个文件夹中开发项目,所以我得到了这个:
$ _SERVER ['DOCUMENT_ROOT'].'/folder/path/to/file.php'
当我上线时,我通常只想要以下内容:
$ _SERVER ['DOCUMENT_ROOT'].'/path/to/file.php'
我知道世界上存在的问题比删除和添加这个文件夹名称还要大,但有没有办法可以轻松实现自动化?我可以以某种方式在本地设置我的文档根目录以包含我正在使用的文件夹吗?我对事情的运作方式有根本的误解吗?这种东西有点新,并希望尽可能多地学习并真正理解"为什么".
非常感谢!
And*_*ore 10
$_SERVER['DOCUMENT_ROOT']为什么不声明一个始终保持Web应用程序根目录的常量而不是使用?
<?php
define('ABSPATH', dirname(__FILE__));
Run Code Online (Sandbox Code Playgroud)
将以下代码放在位于应用程序根文件夹中的文件中,并将其包含在每个页面加载中.
然后,$path = ABSPATH . '/path/to/file.php';无论您的本地副本是否在子目录中,您都可以随时执行此操作folder.
如果您的应用程序已经有一个文件包含在每个页面加载中,您只需将上面的代码放在该文件中即可.
请注意,您可能dirname()需要根据文件的位置添加其他调用.为从webapp的根目录传递的每个目录添加一个.
例如,如果您的webapp位于,/webapp/并且您的"全局包含"位于其中/webapp/includes/framework/init.php,则上述代码需要进行修改:
define('ABSPATH', dirname(dirname(dirname(__FILE__))));
Run Code Online (Sandbox Code Playgroud)
即:dirname()由于webapp根目录中的两个额外文件夹而导致2次额外调用(includes/framework)
澄清
上面的代码只能在一个文件中,一个文件只在您的Web应用程序中.该文件需要包含在每个页面加载中.
如果您已经有任何处理之前包含的文件(例如配置文件或其他文件),则可以将该代码复制并粘贴到该文件中.
数dirname()调用取决于你有多深的文件复制并粘贴在相对于你的web应用程序的根目录中的代码.对于上面的示例,假设您的Web应用程序的根由表示~.
如果您将我的代码复制粘贴到~/abspath.php,那么您需要一个dirname()电话.
如果您将我的代码复制粘贴~/includes/abspath.php,则需要两次dirname()调用.
如果您将我的代码复制粘贴到~/includes/config/abspath.php,则需要三次dirname()调用.现在让我们说这是它的最终位置.
在~/index.php,您执行以下操作:
<?php
require_once('includes/config/abspath.php');
Run Code Online (Sandbox Code Playgroud)
你有权访问ABSPATH.
在~/dir/someOtherPage.php您执行以下操作:
<?php
require_once('../includes/config/abspath.php');
Run Code Online (Sandbox Code Playgroud)
你有权访问ABSPATH.
这就是为什么我说如果你已经有一个文件包含在每个页面加载,更简单的只是删除上面的代码.只需确保相应地修改dirname()通话量.同样,此代码仅用于一个文件.