Php 在扩展类中使用命名空间
我正在使用推进和CodeIgniter。我制作了一个Php 在扩展类中使用命名空间,php,codeigniter,namespaces,propel,Php,Codeigniter,Namespaces,Propel,我正在使用推进和CodeIgniter。我制作了一个MY_Model类(它扩展了CI_Model),使用它的构造函数来加载推进 如果你好奇的话: class MY_Model extends CI_Model{ public function __construct(){ parent::__construct(); require_once '/propel/runtime/lib/Propel.php'; Propel::init('
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模型时,它将为我加载推进。问题是,我在一些生成的模型中添加了名称空间。我想我可以添加使用报告模型构造函数中的代码>行,但不是
class Reports_model extends MY_Model{
function __construct(){
parent::__construct();
use Reports;
}
}
这给了我
语法错误,意外的T_使用
好吧,我想,让我们试着把它放到构造函数之外:
class Reports_model extends MY_Model{
use Reports;
function __construct(){
parent::__construct();
}
}
现在我得到一个较长的错误:
语法错误,意外使用T_,应为T_函数
最后,我添加了使用报告代码>在类声明之前:
use Reports;
class Reports_model extends MY_Model{
function __construct(){
parent::__construct();
}
}
现在我犯了更多的错误
具有非复合名称“Reports”的use语句无效
找不到类“ReportsQuery”
在类中的另一个函数中,我有一行代码,$report=ReportsQuery::create()代码>
那么,如何获得使用报告代码>行开始工作?我真的不想到处添加报告\
我如何才能做到这一点,以便我能够做到:
$report = ReportsQuery::create();
而不是:
$report = Reports\ReportsQuery::create();
只需在带有名称空间的代码中用“\”作为所有没有名称空间的类的前缀显然,use
关键字并不像我想象的那样。这只是告诉PHP在哪里查找类
我需要做的是使用名称空间
关键字来声明我的类位于报告
名称空间中。然后我不得不告诉它使用全局名称空间中的MY_Model
namespace Reports;
use MY_Model;
class Reports_model extends MY_Model{
function __construct(){
parent::__construct();
}
}
我也可以做类报告\u model extends\MY\u model{
而不是使用MY\u model;
行
现在的问题是CodeIgniter找不到Reports\u model
,因为它现在在Reports
命名空间中,而不是全局命名空间中。我在另一个StackOverflow问题()中找到了解决方案
有一个函数叫做,它基本上是魔法
namespace Reports;
use MY_Model;
class_alias('Reports\Reports_model', 'Reports_model', FALSE);
class Reports_model extends MY_Model{
function __construct(){
parent::__construct();
}
}
这很好!好问题…我的后续问题是,为什么PHP不能找到报告命名空间?我猜报告\u模型类的位置使得PHP不知道在哪里可以找到报告。对不起,我不是命名空间专家,但你可能想问这个问题如果你在这里没有得到答案,那就在推进谷歌小组中!@jakerella:报告
命名空间只存在于推进的模型中。我猜,我的模型
的构造函数还没有被调用,所以PHP不知道命名空间在哪里。riilight…hrm。也许你只需要在模型构造函数中始终初始化推进而不是?换句话说,把它放在某种启动区域(不太熟悉CI)。我想知道是否有办法在其他代码也这么做之前声明类的命名空间。我对命名空间也一无所知。我之所以使用它们,是因为这是一个新项目,我想将新表分开。仅供参考,在laravel上,它是由启动CI的同一个人制作的,非常不错。我不是说你现在应该切换,但可能对于您的下一个项目。;)但是,如何使我的代码位于名称空间中?这是这里的问题。“名称空间BlahBlahBlah;”下面的代码将位于名称空间BlahBlahBlah中。如果您在那里定义了某个类,您将能够在\BlahBlahBlah\MyClass之外使用该类,或者添加“使用BlahBlahBlah\MyClass;”指向将使用它的文件,并通过不带命名空间的类名访问它。请注意,在“use”构造中,您必须指定完整的命名空间类名,php无法以这种方式导入某些命名空间的所有类。如果您编写“use”在类内部,它将被解释为向这个类添加trait,您不需要它。实际上,您只需在名称空间之前添加“\”并在glbal范围内访问它。nayjest可能想这么说。@itachi:我在回答中提到:扩展\my\u Model
。问题是,我使用的是CodeIgniter,所以我无法编辑它来添加sla她。