我有三个班级:
每个人都这样做。
因此,用户和页面都需要连接到数据库才能获取数据(用户信息,页面内容) - 他们都可以通过依赖关系访问数据库从数据库注入,这非常好。但是, Page 还需要显示用户获取的数据。
这会产生问题,因为如果我将用户注入页面,那么技术上不会提示 Page 数据库的两个实例,它们都拥有,而用户中存在一个实例?这不是好的做法,对吗?
从我可以收集,'延伸'在这种情况下也不是正确的解决方案。 页面与用户没有直接关系,所以他们不需要成为一个。
所以,我有两个问题:
答案 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() );
?>