2012-11-27 53 views
1

我有第一張圖片的數據結構。下面在PHP中無法正確使用

的代碼是從Class.CIBootstrap.php

正如你可以看到,4號線我做的:

require 'Class.CIAjaxHandler.php'; 

和工作正常。現在,如果它不是ajax我想加載適當的控制器...

這不行。從結構中可以看到CIAjaxHandler和CIBootstrap位於同一個文件夾中,但是我嘗試訪問的CILoginController不是,但爲什麼不能通過它訪問它

require '../controllers/Class.CILoginController.php'

structur code

+0

你得到了什麼錯誤? – hanleyhansen

+0

警告:require(../ controllers/Class.CILoginController.php):無法打開流:C:\ Program Files文件(x86)中沒有這樣的文件或目錄\ Apache Software Foundation \ Apache2.2 \ chapAptana \ classes \ misc \ Class.CIBootstrap.php第39行 – netigger

+0

您是否在require之前嘗試過set_include_path()? – Jimbo

回答

3

這可能是一個好主意定義絕對路徑。因爲:

  • 文件/文件夾可以像你的問題未來
  • 防止出現問題改變位置(父文件不能是不同的呼叫相同)
  • 如果你看一下代碼,你知道在哪裏你應該找到文件

所以,簡單地包括一個恆定的文件,在這裏你可以生成路徑的級聯,像這樣:

define('PATH_ROOT' ,__DIR__.'/'); 
define('PATH_CLASSES' , PATH_ROOT.'classes/'); 
// ... 

並在腳本

require_once PATH_CLASSES.'controller/Class.CIAjaxHandler.php'; 

在這種情況下,你是絕對知道你有,並且其中要包含的文件。

假設你這種結構:

/root.php

<?php echo "Hello World"; 

的index.php

<?php 
include 'path1/path1.php'; 

/路徑1 /路徑1。PHP

<?php 
include '../root.php'; 

在這種情況下,如果你打電話/path1/path1.php腳本的作品,因爲包括父文件夾root.php和它的確定。 但是,如果您致電/index.php它不起作用,因爲包含文件已經相對於父文件夾。

所以,如果在你的軟件中你打算在不同的位置調用不同的文件,使用常量可以是一個解決方案。

另一種解決方案可以設置爲include path或在相對路徑開始時始終指定絕對路徑爲__DIR__

+1

我從來沒有任何問題''/'那麼爲什麼絕對路徑是好主意?你能指定嗎? –

+0

@NullPointer我給了3分......我沒有給出「絕對」規則。有時候這可能是一個好主意。 –

+0

@NullPointer如果你包含一個包含另一個文件,來自不同的其他文件和不同位置的filel,那麼'../'可能會出現一些問題 –

2

有疑問時,使用相對路徑當前文件:

require_once dirname(__FILE__).'/../controller/Class.CILoginController.php'; 

或PHP 5.3+:

require_once __DIR__.'/../controller/Class.CILoginController.php'; 

你的代碼的工作時,有一個請求與$_GET['page'] == 'ajax',但發出此請求最可能發生在misc文件夾中的某個文件) ?但是,當$_GET['page'] !== 'ajax'它可能會被其他腳本調用(如index.phpmisc dir以外),所以當前php進程的工作目錄可能會有所不同。

+0

但事情是,從開始就調用index.php,ajax和regular – netigger

+0

@DavidEverlöf我有相同的設置 - .htaccess文件通過index.php路由一切,然後一切都通過__autoload()。我在我的__autoload()函數中設置了set_include_path(),它工作得很好:) – Jimbo

+0

這個index.php位於你的樹中?你在代碼中的任何地方使用'chdir'嗎? –