gpt4 book ai didi

php - 在扩展类中使用命名空间

转载 作者:行者123 更新时间:2023-12-04 16:51:29 24 4
gpt4 key购买 nike

我正在将 Propel 与 CodeIgniter 一起使用。我做了一个 MY_Model类(扩展 CI_Model )使用其构造函数加载 Propel。

如果你很好奇:

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;
}
}

这给了我

syntax error, unexpected T_USE



好吧,我想,让我们试着把它放在构造函数之外:
class Reports_model extends MY_Model{
use Reports;

function __construct(){
parent::__construct();
}
}

现在我得到一个更长的错误:

syntax error, unexpected T_USE, expecting T_FUNCTION



作为最后的手段,我添加了 use Reports;在类声明之前:
use Reports;

class Reports_model extends MY_Model{
function __construct(){
parent::__construct();
}
}

现在我得到了更多的错误!

The use statement with non-compound name 'Reports' has no effect
Class 'ReportsQuery' not found



在类(class)的另一个函数中,我有一行是 $report = ReportsQuery::create(); .

那么,我如何才能获得 use Reports;线上类?我真的不想添加 Reports\到处。

我怎样才能做到这样我才能做到:
$report = ReportsQuery::create();

代替:
$report = Reports\ReportsQuery::create();

最佳答案

显然,use关键字没有做我认为它做的事情。这只是告诉 PHP 在哪里寻找一个类。

我需要做的是使用 namespace关键字来声明我的类(class)在 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();
}
}

这非常有效!

关于php - 在扩展类中使用命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16817117/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com