我只是将根路径定义为像这样的常量
define("ROOT_PATH", dirname(__FILE__));
所以,在同一个文件中,他们可以识别ROOT_PATH,但是,在其他文件中,ROOT_PATH为null,我检查一些论坛,人们说定义常量可以在全局使用,但是,我不能,是的我需要在PHP.ini中做一些配置吗?
实际上,为什么我这样做是因为我将网站移动到新服务器,但是,新服务器似乎不喜欢我使用相对路径,因此,我需要更改为绝对路径。
更新
谢谢大家,我想我抓住了原因,我使用ajax来调用文件,所以ROOT_PATH为null,因此,我在每个文件中定义了ROOT_PATH,但是出现了另一个问题,我的文件结构是这样的< / p>
/index.php
/ajax/a1.php
/inc/inc.php
index.php:
<?
define('ROOT_PATH',dirname(__FILE__));
include_once ROOT_PATH."/inc/inc.php";
?>
a1.php:
<?
define('ROOT_PATH',dirname(__FILE__));
include_once ROOT_PATH."/inc/inc.php";
?>
所以,当客户端调用a1.php时,它会包含inc.php,但是,它不像我想象的那样,我从chrome开发人员工具中得到这个
<b>Warning</b>: include_once(D:\.............\ajax/inc/a1.php) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in <b>D:\..................\inc\inc.php</b> on line <b>3</b><br />
我检查两个文件生成的ROOT_PATH,发现 FILE 取决于来电者,
如果index.php调用它,
ROOT_PATH = d:\.............\
如果a1.php调用它,
ROOT_PATH = d:\..............\ajax\
然而,我需要调用该文件的两个文件,我可以克服这个问题吗?感谢。
解决:
嗨,我只想弄清楚如何克服路径问题,首先,我们需要在每个目录中设置一个文件,而这个文件存储绝对路径信息是指相对路径(难以理解?): P),我将这个文件path.php
称为我的例子
/index.php
/ajax/a1.php
/inc/inc.php
因此,我们需要在这个3 directroy中添加3个path.php,如下所示,
/index.php
/path.php
/ajax/a1.php
/ajax/path.php
/inc/inc.php
/inc/path.php
path.php
的每个设置都是这样的,
/path.php
<?
if(!defined(ROOT_PATH))
define(ROOT_PATH, dirname(__FILE__));
?>
/ajax/path.php
&amp; /inc/path.php
<?
if(!defined(ROOT_PATH))
define(ROOT_PATH, '..');
?>
所以,如果我们有3个leve结构,请说:/one/two/
,那么/one/two/path.php
应该是这样的
<?
if(!defined(ROOT_PATH))
define(ROOT_PATH, '../..');
?>
在我们设置完所有文件后,我们需要将此path.php
包括在内,例如index.php
/index.php
<?
include_once "path.php";
include_once ROOT_PATH."/inc/inc.php";
...
?>
因此,无论调用者是谁,它都将首先包含本地path.php
,并找出相对路径(/ or .. or ../..)
,因此,包含的文件不会出错,因为所有这些都包括在内正确的符号,比方说,
如果调用者是/index.php,则ROOT_PATH =“FULLPATH”,所以
include_once ROOT_PATH."/inc/inc.php";
=
include_once "FULLPATH"."/inc/inc.php";
如果调用者是/ajax/a1.php,则ROOT_PATH =“..”,所以
include_once ROOT_PATH."/inc/inc.php";
=
include_once ".."."/inc/inc.php";
答案 0 :(得分:7)
我认为你误解了“全球”意味着什么。
脚本中有一个常量,从您定义它到脚本结束,包括在其中的任何脚本include
d或require
d的上下文中。
您的网络服务器上的其他无关脚本并不神奇。
<强>更新强>
所以你试图从它下面的任意文件中获取你的webroot的路径。
当然__FILE__
不起作用,因为单个文件只知道它自己的路径,而不知道目录结构的距离。
你可以试试这个:
在utility.php
:
define('ROOT_PATH', dirname(__FILE__));
在somedir/somefile.php
:
require_once "../utility.php";
echo ROOT_PATH;
答案 1 :(得分:4)
常量是超级全局,一旦define d,您可以使用它们而不使用关键字 global 将其导入当前范围。
定义常量后,它可用于当前文件(从定义开始)到常量定义后包含的必需/包含文件。
这就是全部。如果文件不是,则无法将常量访问到其他文件中 包含在定义文件中,或者如果定义文件未包含在文件中 你需要访问常量。
答案 2 :(得分:3)
这种定义确实是全球性的。在定义之前,您可能正在使用ROOT_PATH
。打开错误报告并检查包含的顺序。
答案 3 :(得分:1)
define()
和其他页面的主要定义并未告诉任何方式限制常量: