【问题标题】:circular reference class loading in php/codeigniter在 php/codeigniter 中加载循环引用类
【发布时间】:2014-07-03 12:13:56
【问题描述】:

在 CodeIgniter 中,我有一个名为 User_Model 的模型和另一个名为 Product_Model 的模型

现在在User_Model 构造函数中,我正在加载我在类中使用的几个模型。

class User_Model extends CI_Model
{
  public function __construct()
  {
    parent::construct();
    $this->load-model("Product_Model");
    //load some more models I need...
  } 
}

在开发产品时,我有时需要使用用户模型,所以我这样做了:

class Product_Model extends CI_Model
{
  public function __construct()
  {
    parent::construct();
    $this->load-model("User_Model");
    //load some more models I need...
  } 
}

问题是因为这些都是循环引用,所以我得到了Fatal error: Maximum function nesting level of '100' reached。我正在使用xdebug,并且我知道它具有删除它的设置。我的问题是 - 在不增加设置限制的情况下处理这个问题的正确方法是什么。我应该如何重构架构?

我知道如果我使用PHP而不使用codeigniter,并创建循环引用(A类加载B类,B类加载A类),PHP会加载N次(我认为是3次)然后标记为*recursive*.

但是我们面临这样的情况,重构的最佳方式是什么?

【问题讨论】:

  • 为什么不自动加载两个模型,你似乎需要它们?
  • 任一模型实际上是否需要另一个模型的实例,还是只需要该类中的一些值 - 在这种情况下,将值传递给构造函数或方法
  • @jtheman - 自动加载的问题是它们在所有地方都使用别名,而 CI 自动加载似乎不允许加载具有别名的模型:-(
  • @UndefinedVariable 你有什么版本的 CI ?是2.2.0 还是3.0 dev
  • @user574632 - 两个模型都使用另一个模型的方法。对于 User 类中的每个,我都执行$this->product->getProductList(); - 这将获得该用户的产品列表。我可以在技术上通过用户来获取我猜的产品列表......但还有其他一些更复杂的例子

标签: php codeigniter model reference cyclic-reference


【解决方案1】:

CI 2.2.0 不允许使用别名自动加载模型,但 3.0-dev 确实支持它。 因为你有 CI 2.2.0,你需要将一个函数从 3.0-dev 核心复制到你的 2.2.0 核心。

Sep

  1. Github 获取 CI 3.0-dev
  2. 打开 system/core/loader.php 的 CI 3.0-dev
  3. 找到public function model函数。
  4. 将其替换为您的 system/core/loader.php 或 CI 2.2.0
  5. 现在你可以像$autoload['model'] = array('first_model' => 'first');一样自动加载

注意:对于那些想要自动加载具有别名但具有CI 2.2.0的模型的人的解决方案@

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多