【问题标题】:Call an object (within class) that was created outside of the class PHP调用在 PHP 类之外创建的对象(在类内)
【发布时间】:2014-01-26 18:43:01
【问题描述】:

我对 OOP 很陌生,所以这个问题更多地与理论有关,而不是我的实际代码。我目前无法访问我的代码,但会尽快添加。

我有一个“数据库”类,它允许我创建新的 PDO 连接并与各种数据库进行交互。我在创建对象时传递数据库连接详细信息,__construct 方法使用这些值构建 PDO 连接。

然后我有各种与数据库交互的方法,例如准备、执行等

我为我需要的每个连接创建了一个对象,这使我可以通过调用对象和我想要使用的方法来快速查询我的任何数据库。

我希望创建另一个名为“users”的类,它允许我与 users 表进行交互。我想要添加、删除和修改用户详细信息的方法。我希望使用现有对象在这些方法中的每一个中查询数据库。而不是必须创建一个新对象并将连接详细信息传递给它(这样我只需要更新创建原始对象的连接详细信息,而不是在多个地方更新它。

我似乎不能这样做,因为我的“数据库”对象超出了我的“用户”类的范围。

谁能告诉我如何使这个对象在“用户”类中可用?更重要的是,这是错误的方法吗?有更好的做法吗?

【问题讨论】:

  • 了解variable scopescope resolution

标签: php database oop object pdo


【解决方案1】:

简单地将您的数据库对象作为特定用户类对象的参数传递:

$userobject->createUser($databaseobject);

或在创建用户对象时传递它:

$userobject = new User($databaseobject);

【讨论】:

  • 正是我想要的。就像你说的“简单”并且非常有意义!谢谢
【解决方案2】:

每个数据库只需要一个 PDO 对象。

除非您打算做一些非常热门的事情,否则我怀疑您永远不需要一个以上的数据库(具有多个表)。 创建一个通用的多数据库处理层对我来说似乎有点矫枉过正。

你现在似乎在做的是每次你想访问同一个数据库的任何部分时创建一个数据库连接。

获得 PDO DB 句柄后,您可以使用它来访问 DB 的任何部分。每次实例化 PDO 对象时,都会创建到同一个 DB 的新连接。

由于同时数据库连接的数量有限,您正在无缘无故地消耗昂贵且稀有的资源。

所以我的建议是让 PDO 对象成为静态类变量,并通过继承同一 PDO 对象的单个实例来构建任何访问器类。

【讨论】:

  • 我要建立的网站需要访问各种数据库。我希望创建一个包含使用 PDO 的方法的类。这样我可以简单地创建一个新对象并在添加新数据库时传递连接详细信息。我希望在其他类中构建方法时调用所需的对象,如果这有意义吗?
  • @user3173706 由于您控制着数据库,我真的不明白创建多个数据库的意义。这将是非常昂贵的。多张桌子是通常的方式。还是您有充分的理由不这样做?
【解决方案3】:

您可以考虑将您的数据库类设为静态(以便可以使用 Database::Query() 等从“任何地方”访问它。

但是在这种情况下,使用单例更合适,您将创建数据库类的一个实例并在所有对象中使用它。

在 PHP 中使用 Google 单例作为指南,但一种常见的模式是在数据库上使用 GetInstance() 的静态方法,这将创建一个 Database 的新实例,它尚不存在。

【讨论】:

  • 单身人士几乎总是一个糟糕的选择:只需创建一个 Database 类的实例,并将其注入正确的位置[通过构造函数或设置器]。
  • @moonwave99 为什么选择不好?他永远只想要一个数据库实例并使用单例来确保这一点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-19
相关资源
最近更新 更多