2012-09-08 68 views
3

我的MVC結構如下:PHP自動加載磁帶機添加命名空間路徑

- web 
    -- Classes 
    --- Loader.php 
    -- Core 
    --- Controller.php 
    --- Model.php 
    --- View.php 
    --- Bootstrap.php 
    --- DB.php 
    -- Project 
    --- Controllers (folder) 
    --- Models (folder) 
    --- Views (folder) 

現在我已指定給每個命名空間。比如我有

namespace Classes; //for Loader.php 
    namespace Core; //For Controller.php, Model.php etc... 
    namespace Project\Controllers; //For Controllers inside Controllers folder etc... 

我的自動加載磁帶機是這樣的:

public static function Autoloader2($className) { 
    $className = explode('\\', $className); 
    $class = array_pop($className); 
    $namespace = implode(DIRECTORY_SEPARATOR, $className); 
    $file = $namespace . DIRECTORY_SEPARATOR . str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php'; 

    require $file; 
} 

和我的index.php使用

spl_autoload_register(array('Loader', 'Autoloader2')); 
    $app = new Core\Bootstrap(); 

當我打開本地主機/網絡/ 我得到以下錯誤:

Warning: require(Core/Project/Controllers/Index.php): failed to open stream: N 

它似乎將Core /添加到請求的文件中。 Index.php位於Project/Controllers內部,而不是Core/Project/Controllers。如果我嘗試刪除

//namespace Core; from Bootstrap.php i get the following error 
    Fatal error: Class 'Core\Bootstrap' not found 

請幫

+0

因此,當執行新的Core \ Bootstrap()時,您會得到Index.php需要警告嗎?正確? – dbf

+0

是的,它追加核心/從命名空間這就是爲什麼它沒有找到它,因爲Index.php是在項目/控制器/內,而不是在覈心/項目/控制器 – Giorgi

+0

您是否使用任何「使用」語句 例如使用Core \ Bootstrap;那麼$ app = new Bootstrap(); – gunnx

回答

1

您應該使用$app = \Core\Bootstrap();

路徑之前的斜槓很重要,沒有它,你的命名空間路徑將是相對於彼此的。

+0

做了同樣的事情。我添加了使用語句給他們所有人,現在頭顯示。我是新手,對「使用」語句不太瞭解 – Giorgi

+0

使用語句是不好的做法,因爲您將所有內容都放在全局名稱空間中,然後冒着名稱衝突的風險。其他程序員也很難調試你的代碼,因爲它可能很難跟蹤類等。 –

+0

除了視圖,現在一切正常。在我的Core \ View.php中我有$ header = new Project \ Views \ index \ header();這顯示標題,也給錯誤說無法找到Project \ Views \ index \ header.php我的Loader假設改變\ to/ – Giorgi