0

我正在通过编写自己的“简单”CMS 系统来扩展我的 php 和一般编码知识。

我的数据库结构如下:

USERS --< WEBSITES --< PAGES

在我的逻辑中,我有三个类,aUserWebsitePage未继承

该类User具有USER TABLE加一个属性的所有$_website属性,

该类具有对象Website的所有属性WEBSITE TABLE加上一个 ARRAYPage

我决定这样做的方式是,在页面加载时,将创建这些类并用数据库数据填充。

因此,在 html 中,我可以简单地通过调用类来回显结果,如下所示:

$USER -> name;
$USER -> website -> get_pages();
$USER -> website -> pages[0] -> get_header();

我意识到这些类可以被继承,所以Page继承WebsiteWebsite继承User

但是如果我这样做,那么我将Page像这样实例化该类:

$PAGES = array(); 
$PAGES[] = new Page( $constructor_data_to_construct_user_website_and_page );

现在,如果我这样做,该对象$PAGES[0]将具有与该页面有关的所有信息,与网站有关的所有信息(第一个父级),以及与用户有关的所有信息(第二个父级)

如果我再创建另一个Page,我只是复制相同的User细节Website

因此,如果我要var_dump $PAGES[0]获取所有相关信息,USER, WEBSITE并且PAGE

如果我要var_dump $PAGES[1]获得USERSAND的所有相同信息WEBSITE,但只是不同的Page数据。

因此,继承会导致不必要的用户和网站对象复制

因为我基本上可以做到:

$PAGES[0] -> username // username is a property of the Users class
$PAGES[1] -> username

两者都将返回完全相同的值。

这肯定很糟糕,因为数据被不必要地复制了!

这个对吗?

或者这个问题是一堆垃圾,而不是使用这种情况inheritance

4

4 回答 4

3

这正是不能使用继承的情况。

继承意味着对IS-A关系建模。典型示例: aStudent是 的类型Person,因此Student继承自Person

继承不是,不是不是为了建立HAS-A关系。典型示例: aCar具有Engine,但Car 不是的类型Engine

当我们有HAS-A关系(例如用户有网站)时,您几乎在所有情况下都应该使用组合而不是继承:

坏的

class Website extends User {}

好的

class Website {
    private $users;
}
于 2012-04-05T12:09:30.313 回答
0

当需要一个基本上是父类的特定类型的子类时,使用继承。因此,例如 Animal -> Mammal -> Horse 的层次结构将是一个合理的继承层次结构,因为马是特定类型的哺乳动物,而哺乳动物是特定类型的动物。

在你的情况下,我不会使用继承。网站包含页面,但页面本身并不是网站的扩展,用户是完全不同的东西。在做出决定时,您通常使用“is-a”与“has-a”,如

一个页面是一个网站与一个网站有一个页面

在这种情况下,我认为后者(has-a)更具描述性。如果短语“is-a”更合适,那么它可能是继承的一个很好的候选者。

于 2012-04-05T12:09:57.947 回答
0

不,这是不正确的。只有当一个是另一个的子类型时,您才应该继承。

例如,如果你代表人,你可能有一个像 Manager 继承 Employee 这样的关系,因为 Manager 是 Employee 的一种特定类型。网站不是特定类型的用户,因此继承没有意义。

相反,您正在寻找的是一个简单的拥有关系(聚合),因为一个网站可能有很多页面,而用户可能有很多网站。

于 2012-04-05T12:10:21.007 回答
0

如果您在其类中将网站和用户字段声明为“静态”:

class Website extends User {
    protected static $_xxx = '123';
}

class User {
    protected static $_username = 'Fred';
}

那么它们将不会被复制,但将是完全相同的值。

但是在那个地方做继承是错误的——它的绑定对象,但不是继承的。所以在这种情况下你不能使用继承——父类必须是子类的超集。

于 2012-04-05T12:14:50.847 回答