PHP - 如何组合三个或更多相互依赖的类?

标签 php class oop

我有三门课:

  1. 数据库
  2. 用户
  3. 页面

每个都按其暗示进行。

因此,用户页面都需要连接到数据库以获取其数据(用户信息、页面内容) - 它们都通过依赖关系访问数据库从数据库注入(inject),这完全没问题。但是,页面需要显示用户获取的数据。

这会成为问题,因为如果我将用户注入(inject)页面,技术上不会提示页面两个 数据库的实例,既是它自己的,也是存在于 User 中的?这不是一个好的做法,对吗?

据我所知,在这种情况下“扩展”也不是正确的解决方案。 页面用户没有直接关系,因此它们不必成为一个。

所以,我有两个问题:

  1. 通过将User注入(inject)Page,将注入(inject)User的数据库对象引导至Page是否“正确”?强>?
  2. 如果不是,正确的方法是什么?

最佳答案

我认为您对引用文献的工作方式存在一些误解。假设我创建了一个数据库对象:

class Database {
  function talkToDb(){
    //does some database stuff
  }
}

现在,假设我想要一个 User 类来访问 Database 对象 - 大概用于读取和写入持久层:

class User {
  persistence = null; //This 'points' to a database object that is injected on object instantiation.
  function __construct(Database $db) {
    $this->persistence = db;
  }
}

要创建用户,您需要在代码中的某处执行以下操作:

$db = new Database();
$aUser = new User($db);
$bUser = new User($db);

此时$aUser$bUser 使用相同 Database 对象。让我们来谈谈 Page:它的实例化与 User 出奇地相似:

class Page {
  $persistence = null;
  $someUser = null;

  function __construct(Database $db, User $user) {
    $this->persistence = $db;
    $this->someUser = $user;
  }
}

然后,您将再次在代码中的其他位置创建 Page 类。就像这样:

$db = new Database();
$aUser = new User($db);
$aPage = new Page($db, $aUser);

此时,$aUser$aPage 中的对象字段指向< Strong>same Database 对象:一个命名 $db(至少,它是在我们的范围内命名的)在上面创建它)。 $aPage 保存对$aUser引用。因为它有两个引用 - 一个指向用户,一个指向数据库 - 它理论上可以通过两种方式访问​​相同数据库对象:

class Page {
  ... //construct everything as above

  function accessExample() {
    //The following two lines call the exact same function on the exact same object
    $this->persistance->talkToDb();
    $this->someUser->persistance->talkToDb();
  }
}

请记住:当您将一个对象“注入(inject)”到另外两个对象中时,您并不是在复制该对象,而是只是复制对该对象的引用。对于许多对象来说,保存同一引用的副本是合适的。

可以以任何一种方式访问​​数据库这一事实并不意味着您应该这样做。您可以通过将用户的数据库设为私有(private)来从页面中屏蔽该数据库。也就是说,不这样做只是代码整洁的问题:您仍然可以

请注意,相互“扩展”PageUser 或从数据库“扩展”完全不合适.扩展类实际上是前一个类的“子集”或“更具体的形式”。 User 不是 Database 的特殊形式:MySqlDatabase。相反,我们知道用户需要有一个可以“持久”其状态的数据库。这就是为什么我们为它提供对某个Database 对象的“引用”。我们应该为需要访问同一数据库的所有此类对象提供相同的引用。许多对象可能持有对同一数据库对象的引用这一事实并不重要:为什么这会导致问题?

(买者自负:我实际上并没有运行上述代码,因此可能存在小错误。)

关于PHP - 如何组合三个或更多相互依赖的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28930899/

相关文章:

java - AES-256-CBC 用 PHP 加密并用 Java 解密

python - 从函数定义外部向 Python 类添加数据成员

java - 音频可以在静态嵌套类中实现吗?

java - 传递 TimeUnits 并转换为毫秒

actionscript-3 - AS3 - 有没有办法以字符串形式检索整个包和类名?

php - 这两者的区别是……?

php - 如何在Nginx PHP配置中启用错误报告

php - 如何使用<?php echo $ data; ?>以便填充Google图表

java - 如何创建一个只有文本名称的类的数组?

php - 将对象传递给方法,将该对象分配给另一个对象,传入的对象仍然是我传入的同一对象