我发现this thread on StackOverflow有关如何从我的网络应用中获取“应用程序根目录”。
但是,该线程中建议的大多数方法很难应用于Windows上的Xampp。说,我有一个“common.php”,它留在我的网络应用程序的app目录中:
/
/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上工作,但我不确定他们是如何找到这样一个优雅的解决方案。
非常感谢所有的提示和建议。
答案 0 :(得分:3)
dirname(__FILE__)
是获取路径的常用方法。实际上,如果您的脚本只能在PHP 5.3或更高版本上运行,__DIR__
将执行相同的操作,并且输入时间会更短。
我认为你涉及common.php的策略有点多余。对于初学者来说,DOCROOT
和COMMONSCRIPT
是无用的 - 他们只是复制一些已经全局的数据。 (所有PHP开发人员都知道$_SERVER['PHP_SELF']
是什么,但我个人不知道COMMONSCRIPT
在没有查找的情况下意味着什么。)
其次,它可能比它的价值更麻烦。比较从/protected/protected2.php
获取/protected/protected.php
路径的一些不同方法:
ABSPATH . "/../protected/protected2.php";
"protected2.php"
dirname(__FILE__) . "/protected2.php";
所有这些都是有效的,但有些比其他更容易。这只是说明您要求的(获取应用程序根目录)可能并不总是您需要的。所以我想说,没有神奇的道路可以解决你所有的问题。如果您发现自己处于ABSPATH
常数可以帮助您的情况,请使用它。
问题的第二部分:正斜杠可以在Windows上运行,甚至可以与反斜杠混合使用。例如:
include("c:\whatever\whatever/something/anything.php");
将在Windows上使用PHP(至少在任何5.0+版本上;不确定4.x)。反斜杠在Unix上不起作用,所以只需要输入正斜杠,你就可以跨平台安全。
如果您正在编写跨平台脚本,则永远不需要在驱动器号中编码。相反,写这样:
include("/whatever/whatever/something/anything.php");
初始/
将由PHP在Windows上解释为c:\
。 (我不知道如何以跨平台的方式指向不同的驱动器号。)
HTH