在扩展类中使用命名空间

时间:2013-05-29 14:49:36

标签: php codeigniter namespaces propel

我和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();

2 个答案:

答案 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)

在名称空间

的代码中,只使用“\”前缀所有没有名称空间的类