composer.json包含以下
...
"autoload": {
...
"psr-0":{"Acme": "app/lib"}
},
在app/lib/Acme/Models/Product/Display.php上,我有以下内容:
<?php
namespace AcmeModelsProduct;
use Eloquent;
use Db;
class Product_Display extends Eloquent
{
我不知道如何在存储库类内部的类名中使用下划线来调用该类:
<?php
namespace AcmeRepositories;
use AcmeModelsProductDisplay as Product_Display;
...
Product_Display::where('page_id','=',$page_id)->first();
这给了我一个类"Acme\Models\Product\Display"未找到错误。我猜问题在于使用Acme\Models\Product\Display作为Product_Display,但我尝试了几种变体,似乎都不能解决问题。
您是否编写了转储自动加载?通过在项目根目录的终端中键入composer dump-autoload
来完成此操作。
每次更改composer.json文件时,都需要允许composer重新构建自动加载文件。在psr-0的情况下,这就是你所需要做的。
在类映射自动加载的情况下,每次将文件添加到正在自动加载的目录中时,都需要composer-dump自动加载。
编辑:
要修复:请将use AcmeModelsProductDisplay as Product_Display;
更改为use AcmeModelsProductDisplay
。将类名从Product_Display更改为仅显示。
我想我发现了这个问题。您有use AcmeModelsProductDisplay as Product_Display;
,但您需要use AcmeModelsProductProduct_Display;
,因为use语句的最后一部分是类的名称。在这种情况下,类的名称实际上是Product_Display,而不是Display(这是文件名)。您可能还需要更改文件名以匹配类名(同样为了惯例起见,您应该这样做)。
您正在使用PSR-0自动加载。该方案在构建文件路径时,将每个反斜杠和下划线转换为目录分隔符。
因此在路径CCD_ 7中搜索CCD_。
PSR-4改变了规则。首先,它只适用于名称空间类,而不适用于旧的Acme_Underscore_Endless_Classnames
。第二,如果你不想的话,你不必有一组emtpy目录。第三:下划线不会转换为目录分隔符。
使用PSR-4规则,可以在路径prefix/Acme/Whatever_Underscored.php
中搜索AcmeWhatever_Underscored
,如果配置了prefix/Whatever_Underscored.php
,则可以搜索
您之所以感到困惑,是因为您将代码中的类名与文件的路径连接起来。PHP只关心use
导入中的类名。始终使用类文件中定义的类名。然后,自动加载器开始工作,并尝试根据PSR-0或PSR-4的规则找到匹配的文件。如果它找不到正确的文件(路径没有正确指向该文件,或者该文件不包含要搜索的类),则会出现错误。