2017-02-18 46 views
0

使用SplClassLoader我總是收到class not found錯誤。我試過各種sources,複製了他們確切的文件夾結構和命名,但仍然not foundPHP SplClassLoader類未找到

我的結構

application 
    - Router 
    - Exceptions 
     - HttpException.php 
    - Klein.php 
index.php 
SplClassLoader.php 

的index.php

$loader = new SplClassLoader('application', 'application'); 
$loader->register(); 
$klein = new \router\Klein(); 

Klein.php

namespace application\router; 
    class Klein{ 
     __construct() 

HttpException.php

namespace Klein\Exceptions; 

use RuntimeException; 

class HttpException extends RuntimeException implements HttpExceptionInterface 
{ 

如何將這些與classLoader一起使用?

確切的錯誤是: ​​

線44 $klein = new \router\Klein();

建議:

$loader = new SplClassLoader('application', 'application'); 
$loader->register(); 
$klein = new application\Router\Klein(); 

給錯誤:

Warning: require(application/application/Router/Klein.php): failed to open stream: No such file or directory in /home/i366963/domains/[domain]/private_html/SplClassLoader.php on line 140 

Fatal error: require(): Failed opening required 'application/application/Router/Klein.php' (include_path='.:/usr/local/lib/php') in /home/i366963/domains/[domain]/private_html/SplClassLoader.php on line 140 
+0

請在其中發佈確切的錯誤消息。 – Augwa

+0

@Augwa在底部添加了錯誤。 –

+0

你的命名空間是\ application \ router,而不是\ router。更改爲新的\應用程序\路由器\。如果你在Unix上運行這個目錄,你的目錄名是區分大小寫的,這意味着你需要將目錄名改爲'router'或者將你的命名空間更新爲'application \ Router' – Augwa

回答

1

所以在看的簽名,它需要兩個參數

$ns (namespace)

$includePath

所以現在你要添加「應用」的命名空間,並在「應用程序」目錄搜索。

這意味着應用程序名稱空間將以應用程序目錄中找到的所有內容爲前綴。

所以,當你加載\應用程序\路由器它正在尋找應用程序\應用程序目錄。

你可以通過做$loader = new SplClassLoader('application');來解決這個問題,這意味着它只會從當前目錄向前搜索。

現在看看你的其他發佈的課程,你會遇到的問題是你的命名空間沒有遵循PSR-0標準,所以你需要確保你的命名空間與你的目錄結構和文件名完全匹配(它在任何基於nix的系統上都是區分大小寫的)

+0

完美!我認爲指定文件夾名稱就足夠了。 –