Php 在扩展类中使用命名空间

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('

我正在使用推进和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('/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她。