Php &引用;“未找到类”;我错过了什么?

Php &引用;“未找到类”;我错过了什么?,php,laravel,laravel-4,laravel-5,Php,Laravel,Laravel 4,Laravel 5,我想向模型添加访问器和变异器。在Laravel4中,一切都很好,但在Laravel5中,我遇到了一些麻烦。 我的应用程序目录中有一个“lib”文件夹,其中包含“db_transformers.php”文件。该文件包含类似“dbDate”的类,其中包含一个set和get函数,用于将数据库中存储的日期转换为用户友好的格式 “db_transformers.php”文件的名称空间为: <?php namespace App\lib; 但我的方法仍然会出错: public functio

我想向模型添加访问器和变异器。在Laravel4中,一切都很好,但在Laravel5中,我遇到了一些麻烦。 我的应用程序目录中有一个“lib”文件夹,其中包含“db_transformers.php”文件。该文件包含类似“dbDate”的类,其中包含一个set和get函数,用于将数据库中存储的日期转换为用户友好的格式

“db_transformers.php”文件的名称空间为:

<?php namespace App\lib;    
但我的方法仍然会出错:

public function getDateTimeAttribute($value)
{
    return dbDate::get($value);
}
这将返回“类”App\dbDate“未找到”错误


我可能有什么问题?

您需要使用完整的类名:
使用App\lib\dbDate

您还可以考虑为此使用视图装饰器,因为在您的模型中这样做确实不合适


有几个软件包可以帮助实现这一点,例如,

您将自动加载(PHP包括/需要类定义文件)与名称空间(一个允许PHP类/函数分层命名以帮助防止代码冲突的系统)混淆了

这是一件容易做的事。在Laravel 5中介绍对自动加载的更改超出了堆栈溢出问题的范围,但是如果您感兴趣,我已经在上面写了多篇文章系列

对于您的特定问题,您说您已经在名为
db\u transformers.php
的文件中定义了一个名为
dbDate
的类,并且
db\u 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关键字将特定类导入当前命名空间。当你说

use App\lib;
你在告诉我

您知道全局类
App\lib
?下面我将把它称为
lib

因为您没有名为
lib
的类,所以这是没有意义的,这就是为什么您的
use
没有帮助的原因

这就是名称空间。您需要解决的另一个问题是自动加载。当您希望在项目中包含类定义文件时,自动加载允许您跳过
require
include
语句/函数

Laravel4使用了一系列不同的自动加载器,包括一个叫做
classmap
autoloader的东西。classmap autoloader自动解析项目中的所有文件以查找类,并创建一个巨大的类在何处的映射(这有点过于简化了,请参阅前面的I链接以了解完整细节)

在Laravel4中,
classmap
autoloader可能会为您读取
lib
中的文件,其中包括取消大多数文件夹的类映射自动加载程序

在Laravel5中可以做的最简单的事情是将项目配置为再次使用ClassMapAutoloader。打开
composer.json
并找到此部分

    "autoload": {
            "classmap": [
                    "database"
            ],
            "psr-4": {
                    "App\\": "app/"
            }
    },
并将
lib
添加到
classmap
autoloader部分

    "autoload": {
            "classmap": [
                    "database",
                    "lib"
            ],
            "psr-4": {
                    "App\\": "app/"
            }
    },
这会告诉composer在创建其自动加载文件时包含
lib
文件夹。您需要运行
dumpautoload
命令

composer dump-autoload

这样做之后,您应该能够按照自己的意愿使用
lib/db_transformers.php
中定义的类

试试作曲者dump,我什么都不做……谢谢你,很好的解释:)我从你的回答中学到了很多!只有一点,我在类映射中添加了“app/lib”,而不是“app”。)再次感谢:)
composer dump-autoload