PHP定义的常量()真的是全局的吗?

时间:2011-05-09 11:12:14

标签: php

我只是将根路径定义为像这样的常量

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";

4 个答案:

答案 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()和其他页面的主要定义并未告诉任何方式限制常量: