PHP 在 Windows 上的 Xampp 中正确获取 "Application Root"

标签 php xampp wamp

我找到了this thread on StackOverflow关于如何从我的网络应用程序内部获取“应用程序根目录”。

但是,该线程中建议的大多数方法很难应用于 Windows 上的 Xampp。假设我有一个“common.php”,它位于我的网络应用程序的应用程序目录中:

/
/app/common.php
/protected/index.php

在我的 common.php 中,我得到的是这样的:

define('DOCROOT', $_SERVER['DOCUMENT_ROOT']);
define('ABSPATH', dirname(__FILE__));
define('COMMONSCRIPT', $_SERVER['PHP_SELF']);

在我需要/protected/index.php 中的 common.php 后,我发现了这个:

C:/xampp/htdocs     //<== echo DOCROOT;
C:\xampp\htdocs\comic\app //<== echo ABSPATH
/comic/protected/index.php //<== echo COMMONSCRIPT

所以最麻烦的部分是路径分隔符不通用,而且,似乎都是 $_SERVER[] asso 数组中的超全局变量,例如 $_SERVER['PHP_SELF'],与“调用者”脚本相关,而不是“被调用者”脚本。

看来我只能依靠 dirname(__FILE__) 来确保它始终返回 common.php 文件的绝对路径。

我当然可以解析 DOCROOT 和 ABSPATH 的返回值,然后计算正确的“应用程序根”。例如,我可以比较 htdocs 之后的部分,并用斜杠替换所有反斜杠以获得类似 UNIX 的路径

我想知道这是处理这个问题的正确方法吗?如果我在 LAMP 环境中部署 Web 应用程序会怎样?这种依赖环境的方法会把我炸死吗?

我使用过一些 PHP 框架,例如 CakePHP 和 CodeIgniter,坦率地说,它们只能在 LAMP 或 WAMP 上工作,但我不确定他们是如何实现如此优雅的解决方案的。

提前非常感谢您的所有提示和建议。

最佳答案

dirname(__FILE__) 是获取路径的常用方法。实际上,如果您的脚本仅在 PHP 5.3 或更高版本上运行,则 __DIR__ 会执行相同的操作,并且键入的时间会短一些。

我认为您涉及 common.php 的策略有点多余。对于初学者来说,DOCROOTCOMMONSCRIPT 毫无用处 - 它们只是复制一些已经全局的数据。 (所有 PHP 开发人员都知道 $_SERVER['PHP_SELF'] 是什么,但我个人如果不查的话就不知道 COMMONSCRIPT 是什么意思。)

其次,这可能带来的麻烦大于其值(value)。比较从 /protected/protected2.php 获取 /protected/protected2.php 路径的一些不同方法:

ABSPATH . "/../protected/protected2.php";
"protected2.php"
dirname(__FILE__) . "/protected2.php";

所有这些都是有效的,但有些比其他更容易。这只是说明您所要求的(获取应用程序根目录)可能并不总是您所需要的。所以我想说,没有什么 Elixir 可以解决你所有的问题。如果您发现 ABSPATH 常量对您有帮助,请使用它。

问题的第二部分:正斜杠可以在 Windows 上使用,甚至可以与反斜杠混合使用。例如:

include("c:\whatever\whatever/something/anything.php");

可以在 Windows 上的 PHP 中工作(至少在任何 5.0+ 版本上;不确定 4.x 是否如此)。反斜杠在 Unix 上不起作用,因此只需始终键入正斜杠即可实现跨平台安全。

如果您正在编写跨平台脚本,您永远不想在驱动器盘符中进行编码。相反,这样写:

include("/whatever/whatever/something/anything.php");

最初的 / 将被 Windows 上的 PHP 解释为 c:\。 (我不知道如何以跨平台的方式指向不同的驱动器号。)

HTH

关于PHP 在 Windows 上的 Xampp 中正确获取 "Application Root",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2796217/

相关文章:

php - 教义2获取代理类的真实类名

php - 计算MySQL和PHP中的日期差异

javascript - getElementById 在代码中返回 null 但在控制台中工作

html - 为什么我的 index.html 没有将我的 style.css 放在我的 css 文件夹中?

ssl - Wamp2 和 "The ordinal 942 could not be located in the dynamic link library LIBEAY.dll"

php - Windows : #1045 - Access denied for user 'root' @'localhost' (using password: YES) phpmyadmin

php - 如何在 PHP 中更新用户帐户信息的多个列

login - 如何在xampp中获取phpmyadmin的登录选项

当我尝试定义数据库设置时出现 java.net.BindException 。这是为什么?

mysql - WordPress MySql 不兼容。本地开发的版本 : 5. 6.17 和托管提供商版本 5.5.36