我和CodeIgniter一起使用Propel。我创建了一个使用其构造函数加载Propel的MY_Model
类(扩展CI_Model
)。
如果你很好奇:
class MY_Model extends CI_Model{
public function __construct(){
parent::__construct();
require_once '/propel/runtime/lib/Propel.php';
Propel::init('/build/conf/project-conf.php');
set_include_path('/build/classes'.PATH_SEPARATOR.get_include_path());
}
}
所以,现在当我创建一个新的CodeIgniter模型时,它会为我加载Propel。事实上,我在一些Propel生成的模型中添加了名称空间。我想我可以在模型的构造函数中添加use Reports;
行,但是没有。
class Reports_model extends MY_Model{
function __construct(){
parent::__construct();
use Reports;
}
}
这给了我
语法错误,意外的T_USE
好的,我想,让我们试着把它放在构造函数之外:
class Reports_model extends MY_Model{
use Reports;
function __construct(){
parent::__construct();
}
}
现在我得到一个更长的错误:
语法错误,意外T_USE,期待T_FUNCTION
作为最后的手段,我在课程声明之前添加了use Reports;
:
use Reports;
class Reports_model extends MY_Model{
function __construct(){
parent::__construct();
}
}
现在我犯了更多错误!
非复合名称'Reports'的use语句无效 未找到“ReportsQuery”类
在班级的另一个函数中,我有一行$report = ReportsQuery::create();
。
那么,我怎样才能让use Reports;
行工作?我真的不想在任何地方添加Reports\
。
我怎样才能做到这一点:
$report = ReportsQuery::create();
而不是:
$report = Reports\ReportsQuery::create();
答案 0 :(得分:2)
显然,use
关键字不能完成我所做的事情。这只是告诉PHP在哪里寻找一个类。
我需要做的是使用namespace
关键字来声明我的类位于Reports
命名空间中。然后我不得不告诉它使用全局命名空间中的MY_Model
。
namespace Reports;
use MY_Model;
class Reports_model extends MY_Model{
function __construct(){
parent::__construct();
}
}
我也可以class Reports_model extends \MY_Model{
代替use MY_Model;
行。
现在问题是CodeIgniter找不到Reports_model
,因为它现在位于Reports
命名空间内,而不是全局命名空间。我在另一个StackOverflow问题(https://stackoverflow.com/a/14008411/206403)中找到了解决方案。
有一个名为class_alias
的功能基本上是神奇的。
namespace Reports;
use MY_Model;
class_alias('Reports\Reports_model', 'Reports_model', FALSE);
class Reports_model extends MY_Model{
function __construct(){
parent::__construct();
}
}
这完美无缺!
答案 1 :(得分:0)
在名称空间
的代码中,只使用“\”前缀所有没有名称空间的类