2014-12-24 39 views
0

我已閱讀過SO中相同問題的答案,但它們並沒有幫助我解決我的問題。SPL Autoload不加載類

我有如下的目錄結構:

enter image description here

這個類:

namespace Util; 

final class Autoloader 
{ 
    public static function loader($class) 
    { 
     define('PHP_FILE_EXTENSION', '.php'); 
     $filename = ''; 
     $file = ''; 
     $phisicalFilePath = ''; 

     $filename = $class . PHP_FILE_EXTENSION; 
     $phisicalFilePath = __DIR__ . DIRECTORY_SEPARATOR . $filename; 

     if (file_exists($phisicalFilePath)) { 
      require_once 'util/' . $filename; 
     } 
    } 
} 

我用上面的類從bootstrap.php文件,如下所示:

require_once('util/Autoloader.php'); 

spl_autoload_register('Util\Autoloader::loader'); 

我從撥打電話文件:

require_once('bootstrap.php'); 

echo StringUtils::randomString(10); 

但不幸的是,SPL自動加載不加載類:

Fatal error: Class 'StringUtils' not found in 'xxx\index.php' on line 5 

我在做什麼錯?

+0

小心:'StringUtils'!== stringutils' –

+0

@MarkBaker是的,這是最後一刻的變化。我會更新圖片。 – leoMestizo

+0

您正在檢查一個文件('$ phisicalFilePath')的存在,但包含另一個(''back-end/util /'。$ filename') –

回答

1

我有另一種解決方案。如果你想繼續PHP開發,這可能會很有用。

看看這篇文章 - http://www.php-fig.org/psr/psr-0/http://www.php-fig.org/psr/psr-4/。它們包含關於基於PHP的項目的類結構的官方批准標準。

在這種情況下,我們不應該調查車輪 - 所以如果可能的話,請儘量與「官方標準」保持聯繫。


我創建了示例項目來展示如何應用上述規則。

項目結構:

Project tree

Autoloader.php從這裏複製:https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md#class-example。唯一的區別是我的自動加載器放置在命名空間Util中,其類更名爲Autoloader

然後Account.php包含:

<?php 

namespace Model; 

class Account { } 

而且index.php

<?php 

require_once('Util/Autoloader.php'); 

$autoloader = new \Util\Autoloader(); 
$autoloader->addNamespace('\Model\\', __DIR__ . '/Model'); 
$autoloader->register(); 

$model = new \Model\Account(); 
+1

更多框架互操作組推薦的案例,但當然推薦在任何應用中使用 –

+0

我剛更改我的代碼以使用PSR-4回調示例,但它沒有工作,但感謝您的建議。 – leoMestizo

+1

@leoMestizo,等一下 - 我會用示例 –

0

我只是做了一個項目,作爲你的和複製文件的內容。 它適合我。 你的代碼沒有問題。

+0

這有很多意義......我只是改變我的代碼使用'include',我得到了同樣的錯誤。 – leoMestizo

+0

我認爲只有一個原因是代碼在我的系統上工作,不幸的是不能在你的系統上工作。檢查您的StringUtils.php文件的權限。 – mhndev