0

我已经创建了自己的 MVC 框架,它是 PSR-0 兼容的 atm。并使用 php-ActiveRecord 作为 ORM。我发现了一个问题,我从一个名为 的控制器(User存在于命名空间TapMVC\Application中)尝试调用一个 ActiveRecord 模型,它也被称为User但存在于命名空间中,TapMVC\Db如下所示:

namespace TapMVC\Application;

use TapMVC\Db;

class User extends Controller {
    function index() {
        print_r(Db\User::find('all'));
    }
}

这给出了以下错误:

无法在第 12 行的 /path/to/project/app/Controllers/user.php 中重新声明类 TapMVC\Application\User

其中第 12 行是用户控制器的原型/声明。

为什么我不能这样做?我认为如果你的类在不同的命名空间中并且在实例化时有命名空间前缀,那么使用相同的名称就可以了吗?此外,看起来数据模型是在控制器之前通过自动加载声明的(因为它是触发错误的用户控制器声明),那么为什么当数据模型在命名空间TapMVC\Db而不是TapMVC\Application控制器在哪里时会发生冲突呢?

我可以看到,即使您定义了不同的名称空间,PHP 也会在与活动文件中的名称空间相同的名称空间下声明该对象,但我不确定。

希望有人可以提供帮助,所以我不需要像这样命名我的数据模型:(ProjectName-prefix)User并编辑数据库表以获得用户模型和用户控制器。

4

1 回答 1

0

我发现了错误!:-D

问题在于我的控制器、模型等的自动加载功能,因为我没有处理命名空间。因此,当我尝试加载同名的控制器或模型时,该spl_autoload_register函数将从检查控制器开始,并且由于我的函数忽略了类名称空间,因此我将在以下两种情况下:TapMVC\Application\User找到TapMVC\Db\User用户控制器类,停止自动加载列表,并尝试声明它。

当我处理命名空间并确保控制器/模型只有在正确的命名空间中时才被加载,这一切都解决了。如果不是,则该函数不执行任何操作,并且该spl_autoload_register函数继续沿自动加载函数列表向下移动。

这个问题比想象的更具体的框架,归结为自动加载,我认为这不是问题......出于某种原因,我很抱歉。很高兴知道我发现了错误。

于 2013-06-10T08:31:28.893 回答