你在自动加载(包括/需要类定义文件的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