我已经创建了自己的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'User
和TapMVC'Db'User
找到User-controller类,停止自动加载列表,并尝试声明它。
这一切都解决了,当我照顾的名称空间,并确保控制器/模型只有加载,只要他们是在正确的名称空间。如果不是,则该函数不执行任何操作,并且spl_autoload_register
函数继续在自动加载函数列表中向下运行。
这个问题比想象的更具体,归结为自动加载,我不认为这是问题…出于某种原因,为此我很抱歉。