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

时间:2015-03-08 19:27:35

标签: php class oop

我有三个班级:

  1. 数据库
  2. 用户
  3. 网页
  4. 每个人都这样做。

    因此,用户页面都需要连接到数据库才能获取数据(用户信息,页面内容) - 他们都可以通过依赖关系访问数据库从数据库注入,这非常好。但是, Page 还需要显示用户获取的数据。

    这会产生问题,因为如果我将用户注入页面,那么技术上不会提示 Page 数据库的两个实例,它们都拥有,而用户中存在一个实例?这不是好的做法,对吗?

    从我可以收集,'延伸'在这种情况下也不是正确的解决方案。 页面用户没有直接关系,所以他们不需要成为一个。

    所以,我有两个问题:

    1. 它是否适当'通过将用户注入页面来将注入用户的数据库对象引导至页面
    2. 如果没有,那么正确的方法是什么?

2 个答案:

答案 0 :(得分:3)

我认为你对引用如何工作有一些误解。我们假设我创建了一个数据库对象:

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

要创建User,您可以在代码中的某处执行以下操作:

$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中的对象字段 指向 相同 { {1}}对象:名为 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(); } } 数据库设为私有来屏蔽该User数据库。也就是说,不这样做只是代码清洁的问题:你仍然可以

请注意完全不合适来扩展'彼此之间或来自Page的{​​{1}}或Page。扩展类实际上是一个'子集'或者更具体的形式'以前的。 User不是Database的特殊形式:User 。相反,我们知道Database需要拥有一个可以持续存储的数据库'它的状态是。这就是为什么我们提供一个参考'到一些MySqlDatabase对象。我们应该为需要访问同一User的所有此类对象提供相同的引用。许多对象可能持有对同一数据库对象的引用这一事实并不重要:为什么会导致问题?

(警告:我实际上并没有运行上面的代码,因此可能存在小错误。)

答案 1 :(得分:0)

在数据库类中使用构造函数并将其设置为类属性。 当你扩展它时,假设它在用户和页面类中都可用。

<?php
class Database
{

}
class MySql extends Database
{
    private $sDbName      = '';
    private $sUsername    = '';
    private $sPassword    = '';
    private $sHost        = '';
    private $oConnection  = null;

    public function __construct()
    {
        $this->oConnection = new PDO( 
            'mysql:host=' 
            . $this->sHost 
            . ';dbname=' 
            . $this->sDbName, 
            $this->sUsername, 
            $this->sPassword 
            );
    }
    public function getDb()
    {
        return $this->oConnection;
    }
}

class User extends MySql
{

}
class Page extends User
{

}

$oPage = new Page;
var_dump( $oPage->getDb() );
?>