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

时间:2013-12-12 22:08:58

标签: php laravel-4

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 
{

如果在存储库类的Class Name中给出下划线,我就失去了如何调用该类:

<?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,但我尝试了几种变体,但似乎都没有解决问题。

2 个答案:

答案 0 :(得分:1)

你是作曲家dump-autoload吗?通过从项目的根目录在终端中键入composer dump-autoload来执行此操作。

每次更改composer.json文件时,都需要让composer重建自动加载文件。在psr-0的情况下,这就是你需要做的全部。

对于类映射自动加载,每次将文件添加到自动加载的目录时,都需要编写转储自动加载。

编辑:

要解决此问题:将use Acme\Models\Product\Display as Product_Display;更改为use Acme\Models\Product\Display。将类名从Product_Display更改为Display。

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

答案 1 :(得分:1)

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

因此,在路径Acme\Whatever_Underscored中搜索prefix/Acme/Whatever/Underscored.php

对于PSR-4,规则已更改。首先,它仅适用于命名空间类,不适用于旧的Acme_Underscore_Endless_Classnames。其次,如果您不想,则不必具有一组其他空目录。第三:下划线不会转换为目录分隔符。

使用PSR-4规则,将在路径Acme\Whatever_Underscored中搜索prefix/Acme/Whatever_Underscored.php-甚至在prefix/Whatever_Underscored.php的路径中进行搜索。

您感到困惑,因为您将代码中的类名与文件的路径连接在一起。 PHP仅关心use导入中的类名。始终使用班级文件中定义的班级名称。然后,自动装带器将启动并尝试查找匹配的文件-具有PSR-0或PSR-4的规则。如果找不到正确的文件(路径未正确指向文件,或者文件不包含要搜索的类),则会出现错误。