【问题标题】:PHP object creation endless loopPHP对象创建无限循环
【发布时间】:2012-03-16 09:09:22
【问题描述】:

这就是我有足够的知识去危险的地方。

我正在开发一个具有不同类型的相关类的网络应用程序。例如,有一个“Item”类和一个“User”类。 “Item”类有一个名为“Owner”的属性,它引用“User”对象。同样,“User”类有一个名为“Items_array”的属性,它是一个包含(你猜对了)“Item”对象的数组。

我的理解是对象作为引用自动返回,所以我有用于 fetch_item、fetch_user 等的函数。这些函数跟踪对象的主数组,如果它已经存在则返回正确的对象,如果存在则创建一个新对象它不存在。例如,下面是获取用户的代码。

public function get_user ($userID) {
    if (!isset ($this->users_arr[$userID]))
        $this->users_arr[$userID] = new User($userID);
    return $this->users_arr[$userID];
}

我的 Items 类中有一些属性可以毫无问题地存储 User 对象。今天早上,我在我的 User 类中添加了一些属性来存储 Item 对象,现在我不断收到“无法打开数据库连接”错误。我已将此与 Item 对象的创建隔离 - 当我评论说一切正常时。我相当确定我已经创建了某种无限循环,其中项目不是使用引用,而是创建用户,而用户又试图重新创建项目。

这有意义吗?有没有人遇到过这样的问题,或者对如何解决这个问题有任何想法?

【问题讨论】:

  • 请多发些代码,比如调用get_user()的部分
  • 您使用__construct() 方法吗?如果不是这样,创建新对象永远不会自行结束,因为属性只能由定义中的标量设置。
  • 您所描述的可能会导致某种“内存不足”错误,而不是数据库连接错误。你确定数据库服务器正在运行吗?
  • 请告诉我们您在用户对象的属性中添加了什么。
  • 给自己一个远程调试器并逐步完成。这样您就可以快速了解发生了什么。

标签: php oop infinite-loop


【解决方案1】:

由于添加了一些代码,我能想到出现“无法打开数据库连接”错误的唯一原因是您打开了太多代码。例如,MySQL 限制每个用户(即您)有 30 个连接。通常,每个脚本不应有多个连接,如果您没有全局存储连接句柄,您可能会在此处发生错误。

【讨论】:

  • 我的数据库连接工厂使用了与上面相同的逻辑,但结果是一个类型阻止它返回现有的连接!这与“无限循环”问题(也已解决)相结合导致数据库连接错误。在介绍循环问题之前,我从未将连接数最大化。
猜你喜欢
  • 1970-01-01
  • 2015-02-23
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多