2011-05-09 162 views
0

我只是定義了一個根路徑是這樣由PHP define()定義的常量真的是全局的嗎?

define("ROOT_PATH", dirname(__FILE__)); 

這樣一個常數,在相同的文件,他們能夠認識到ROOT_PATH,然而,在其他文件中,ROOT_PATH是空的,我查了一些論壇上,有人說定義的常量可以在全局中使用,但是,我不能,是否需要在PHP.ini中執行一些配置?

實際上,爲什麼我這樣做是因爲我將網站移動到新服務器,但是,新服務器似乎不喜歡我使用相對路徑,因此,我需要更改爲絕對路徑。

UPDATE:

謝謝大家,我想我抓住的原因,我用AJAX調用文件,所以ROOT_PATH爲空,因此,我在每一個文件中定義ROOT_PATH,但另一個問題是出現,我的文件結構是這樣的

/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路。PHP的在這3 directroy,爲遵循,

/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 & /inc/path.php

<? 

if(!defined(ROOT_PATH)) 
    define(ROOT_PATH, '..'); 

?> 

所以,如果我們有3升前夜結構,讓說:/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 ../..),因此, cluded文件不會是錯誤的,因爲所有的人都包括有正確的符號,讓說,

如果呼叫者的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"; 
+5

你是否在第二個腳本中包含了包含'define()'語句的php腳本? – KingCrunch 2011-05-09 11:15:49

+0

...或者你是否將第二個腳本包含在定義常量的腳本中? – Eineki 2011-05-09 11:21:59

回答

7

我想你誤會什麼「全球」手段。

腳本中有一個常量,從定義的點開始直到腳本結束,包括腳本中的任何腳本include d或require d。

它在您的web服務器上其他無關的腳本中並不神奇。


更新

所以你想從它下面任意文件中獲取路徑到您的根目錄。

當然__FILE__將不起作用,因爲單個文件只知道它自己的路徑,而不知道它在目錄結構下多遠。

你可以試試這個:

utility.php

define('ROOT_PATH', dirname(__FILE__)); 

somedir/somefile.php

require_once "../utility.php"; 
echo ROOT_PATH; 
+0

是的,你是對的,我誤解了全球的手段,請看我的更新。 – ykc 2011-05-09 12:03:47

+0

@facebook:查看我的更新。 – 2011-05-09 12:56:03

+0

謝謝,我做了類似的事情,並解決了這個問題。 – ykc 2011-05-09 14:38:45

3

這樣的定義確實是全局性的。在定義之前,您可能正在使用ROOT_PATH。打開錯誤報告並檢查包含的順序。

4

常數超全局,一旦define d,你可以使用它們不使用關鍵字全球將其導入當前範圍。

一旦你定義了一個常量,它就可以進入當前文件(從定義開始)和常量定義之後包含的必需/包含文件中。

這就是全部。如果文件不是 包含在定義的文件中,或者如果定義文件未包含在您需要訪問該常量的文件中,則不能訪問該常量。

+0

第一句話是誤導人的。 「全局文件級別」將是您可以在定義文件的任何地方(定義之後)使用的東西,但不能用於鏈接/包含文件。 – binaryLV 2011-05-09 11:23:41

+0

@binaryLV:你說得對,我只是把它改寫了一下 – Eineki 2011-05-09 11:28:43