带下划线的命名空间和类名


Namespaces and Class names with underscores

composer.json包含以下

...
"autoload": {
    ...
    "psr-0":{"Acme": "app/lib"}
},

在app/lib/Acme/Models/Product/Display.php上,我有以下内容:

<?php
namespace Acme'Models'Product;
use Eloquent;
use Db;
class Product_Display extends Eloquent 
{

我不知道如何在存储库类内部的类名中使用下划线来调用该类:

<?php
namespace Acme'Repositories;
use Acme'Models'Product'Display 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 Acme'Models'Product'Display as Product_Display;更改为use Acme'Models'Product'Display。将类名从Product_Display更改为仅显示。

我想我发现了这个问题。您有use Acme'Models'Product'Display as Product_Display;,但您需要use Acme'Models'Product'Product_Display;,因为use语句的最后一部分是类的名称。在这种情况下,类的名称实际上是Product_Display,而不是Display(这是文件名)。您可能还需要更改文件名以匹配类名(同样为了惯例起见,您应该这样做)。

您正在使用PSR-0自动加载。该方案在构建文件路径时,将每个反斜杠和下划线转换为目录分隔符。

因此在路径CCD_ 7中搜索CCD_。

PSR-4改变了规则。首先,它只适用于名称空间类,而不适用于旧的Acme_Underscore_Endless_Classnames。第二,如果你不想的话,你不必有一组emtpy目录。第三:下划线不会转换为目录分隔符。

使用PSR-4规则,可以在路径prefix/Acme/Whatever_Underscored.php中搜索Acme'Whatever_Underscored,如果配置了prefix/Whatever_Underscored.php,则可以搜索

您之所以感到困惑,是因为您将代码中的类名与文件的路径连接起来。PHP只关心use导入中的类名。始终使用类文件中定义的类名。然后,自动加载器开始工作,并尝试根据PSR-0或PSR-4的规则找到匹配的文件。如果它找不到正确的文件(路径没有正确指向该文件,或者该文件不包含要搜索的类),则会出现错误。