Php类方法中的类声明具有相同的名称和PSR-0名称空间,错误


Php class declaration inside class method with same names and PSR-0 namespaces, error

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

namespace TapMVC'Application;
use TapMVC'Db;
class User extends Controller {
    function index() {
        print_r(Db'User::find('all'));
    }
}

这会产生以下错误:

不能重新声明类TapMVC'Application'User in/path/to/project/app/Controllers/user.php第12行

第12行是User-controller的原型/声明。

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

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

希望有人能帮助,所以我不需要命名我的数据模型这样:(ProjectName-prefix)User和编辑数据库表,以便有一个用户模型和一个用户控制器。

我发现错误了!: - d

问题在于我的自动加载功能的控制器,模型等,因为我没有照顾命名空间。因此,当我试图加载相同的控制器或模型时,spl_autoload_register函数将通过检查控制器开始,并且由于我的函数忽略了类的名称空间,它将在以下两种情况下:TapMVC'Application'UserTapMVC'Db'User找到User-controller类,停止自动加载列表,并尝试声明它。

这一切都解决了,当我照顾的名称空间,并确保控制器/模型只有加载,只要他们是在正确的名称空间。如果不是,则该函数不执行任何操作,并且spl_autoload_register函数继续在自动加载函数列表中向下运行。

这个问题比想象的更具体,归结为自动加载,我不认为这是问题…出于某种原因,为此我很抱歉。