你在自動加載(包括/需要類定義文件的PHP)與名稱空間(允許PHP類/函數的分層命名以幫助防止代碼衝突的系統)混淆。
這是一個容易的事。覆蓋變化Laravel 5到自動加載超出了堆棧溢出問題的範圍,但如果你有興趣,我寫上how autoloading works with composer/Laravel 4/Laravel 5多個系列文章。
爲了您的具體問題,你說你已經定義了一個名爲dbDate
在一個名爲db_transformers.php
文件類,而db_transformers.php
有App\lib
命名空間。
#File: lib/db_transformers.php
namespace App\lib;
//other code
class dbDate
{
//other code
}
//other code
這意味着你的班級的全名是App\lib\dbDate
。 整個事物是課程的名稱。這可能是習慣使用PHP中的命名空間的最大的事情。
這意味着,如果你想使用其他代碼的類,你需要參考類的全名,包括前置反斜槓。
return \App\lib\DbDate::get($value);
你也可以使用關鍵字use
use App\lib\DbDate;
//other code
public function getDateTimeAttribute($value)
{
//since we imported the class with `use`, we don't need to type the full name
return DbDate::get($value);
}
使用關鍵字進口特定類到當前的命名空間導入類。當你說
use App\lib;
你告訴PHP
你知道,全球一流的App\lib
?我要提到它下面爲lib
因爲你沒有一個名爲lib
類,這是沒有意義的,這就是爲什麼你的use
沒有幫助。
這就是命名空間。您需要解決的另一個問題是自動加載。自動加載可以讓您在項目中需要類定義文件時跳過require
或include
語句/函數。
Laravel 4使用了一堆不同的自動加載器,其中包括一種名爲classmap
的自動加載器。 classmap autoloader會自動解析項目中所有尋找類的文件,並創建一個巨大的映射圖,哪個類是哪個類的(這簡化了一下,詳見前面鏈接的article series)。
在Laravel 4中,classmap
自動加載器可能爲您讀取lib
中的文件。 Laravel 5 reduced the number of autoloaders,其中包括擺脫大多數文件夾的類圖自動加載器。
您可以在Laravel 5中執行的最簡單的事情是將您的項目配置爲再次使用類映像自動加載器。打開composer.json
,發現這部分
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/"
}
},
並添加lib
到classmap
自動加載部分
"autoload": {
"classmap": [
"database",
"lib"
],
"psr-4": {
"App\\": "app/"
}
},
這告訴作曲家包括當它創建了自動加載文件夾lib
。你需要做的是後運行dumpautoload
命令
composer dump-autoload
,你應該能夠爲您希望使用的lib/db_transformers.php
定義的類。
嘗試作曲家dump-autoload – Ymartin 2015-04-03 20:04:34
什麼都不做...... – LuMa 2015-04-03 20:08:42