2014-07-13 38 views
0

Ok !!!現在,我覺得爲什麼spl_autoload_register()不能加載類。PHP當命名空間使用時,spl_autoload_register無法加載需要範圍的類

我的文件夾結構是這樣的..

  • 應用

    • 控制器
      • 的welcome.php
  • 系統

    • 核心
      • BaseController.php
      • Load.php
  • 的index.php

我BaseController.php代碼

<?php 
namespace system\core; 

class BaseController { 
    public function __construct() { 
     spl_autoload_register(array($this, 'loader')); 
    } 

    private function loader($className) {    
     $className = ltrim($className, '\\'); 
     $fileName = ''; 
     $namespace = ''; 
     if ($lastNsPos = strrpos($className, '\\')) { 
      $namespace = substr($className, 0, $lastNsPos); 
      $className = substr($className, $lastNsPos + 1); 
      $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; 
     } 
     $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; 

     require $fileName; 
    } 
} 

我Load.php代碼

<?php 
namespace system\core; 

class Load { 
    public function view() 
    { 
     echo "Method for loading view"; 
    } 
} 

我的welcome.php代碼

<?php 
class Welcome extends system\core\BaseController { 
    public function index() 
    { 
     $obj_load = new Load(); 
     $obj_load->view(); 
    } 
} 

我的index.php代碼

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', '1'); 

require_once "system/core/BaseController.php"; 
require_once "application/controller/welcome.php"; 
$welcome = new welcome(); 
echo $welcome->index(); 

當我執行此代碼( index.php)我得到以下錯誤...

Fatal error: Class 'Load' not found in /var/www/nut/test/application/controller/welcome.php on line 5 

但是,如果我從Load.php中刪除命名空間,我沒有得到任何錯誤。我無法理解爲什麼該名稱空間(用於Load.php)創建錯誤。

任何想法...

問候

+0

你的類名是'system \ core \ Load';你正在嘗試加載''system/core /'.$ className。 '.php';'計算出一個名爲'system/core/system \ core \ Load.php'的文件.... –

+0

您的自動加載器應該將類名中的命名空間分隔符轉換爲文件夾分隔符,然後使用這些分隔符試圖硬編碼他們 –

+0

@MarkBaker我刪除了我的自動加載程序代碼,現在使用PHP-FIG示例代碼顯示在此鏈接 - > http://www.php-fig.org/psr/psr-0/ 但是,仍然我得到同樣的錯誤。 – mi6crazyheart

回答

1

正如馬克指出,您要包括你的文件時使用了錯誤的字符。 This頁面應該讓事情更清楚。

編輯: 你的代碼中有很多錯誤。命名空間的要點是你必須正確地引用它們(以及正確地聲明它們,你沒有做到這兩點,這就是自動載入代碼不起作用的原因)。自動載入代碼也沒有真正的機會運行,因爲你有它隱藏在一個構造函數中,而不是首先被加載的類。試試這個:

的index.php

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', '1'); 

require_once("system/core/AutoLoader.php"); 
$welcome = new \application\controller\welcome(); 
echo $welcome->index(); 

歡迎。PHP(注意小寫的類名和添加命名空間)

<?php 

namespace application\controller; 

class welcome extends \system\core\BaseController { 
    public function index() 
    { 
     $obj_load = new \system\core\Load(); 
     return $obj_load->view(); 
    } 
} 

Load.php

<?php 
namespace system\core; 

class Load { 
    public function view() 
    { 
     return "Method for loading view"; 
    } 
} 

BaseController.php

<?php 
namespace system\core; 

class BaseController { 
// public function __construct() { 
//  spl_autoload_register(array($this, 'loader')); 
// } 
// 
// private function loader($className) { 
//  $className = ltrim($className, '\\'); 
//  $fileName = ''; 
//  $namespace = ''; 
//  if ($lastNsPos = strrpos($className, '\\')) { 
//   $namespace = substr($className, 0, $lastNsPos); 
//   $className = substr($className, $lastNsPos + 1); 
//   $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; 
//  } 
//  $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; 
// 
//  require $fileName; 
// } 
} 

新文件:系統\核心\自動裝載.php

<?php 

namespace system\core; 

class AutoLoader { 

    static public function loader($className) { 
     $className = ltrim($className, '\\'); 
     $fileName = ''; 
     $namespace = ''; 
     if ($lastNsPos = strrpos($className, '\\')) { 
      $namespace = substr($className, 0, $lastNsPos); 
      $className = substr($className, $lastNsPos + 1); 
      $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; 
     } 
     $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; 

     require $fileName; 
    } 

} 

spl_autoload_register(array('\system\core\AutoLoader', 'loader')); 

I也改變了代碼返回的字符串,而不是顯示它,因爲你已經在index.php中回顯它

+0

我刪除了我的自動加載器代碼,現在使用PHP-FIG示例代碼,如此鏈接所示 - > http://www.php-fig.org/psr/psr-0/ 但是,我仍然得到相同的錯誤。 – mi6crazyheart

+0

我明白了。學到了一些教訓。感謝您的及時迴應。 – mi6crazyheart

相關問題