Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 面向对象:您将如何设置艺术家、专辑和专辑;面向对象的歌曲关系_Php_Oop_Class_Inheritance - Fatal编程技术网

Php 面向对象:您将如何设置艺术家、专辑和专辑;面向对象的歌曲关系

Php 面向对象:您将如何设置艺术家、专辑和专辑;面向对象的歌曲关系,php,oop,class,inheritance,Php,Oop,Class,Inheritance,我理解继承的基本原理,但这一点让我感到困惑。你会怎么说: 相册对象具有一个或多个艺术家对象 唱片集对象具有一个或多个歌曲对象 我当前的代码只允许每个对象播放一首歌曲: class Song extends Album{} class Album extends Artist{} 我肯定我忽略了一些重要的事情。有什么想法吗 我是用PHP做这件事的我认为这三个类中没有任何继承。一首歌是一张专辑吗?不,我不认为这是如此的歌曲不应该从专辑继承。专辑是艺术家吗?不,我也不这么认为,所以这张专辑不应该

我理解继承的基本原理,但这一点让我感到困惑。你会怎么说:

  • 相册对象具有一个或多个艺术家对象
  • 唱片集对象具有一个或多个歌曲对象
我当前的代码只允许每个对象播放一首歌曲:

class Song extends Album{}
class Album extends Artist{}
我肯定我忽略了一些重要的事情。有什么想法吗


我是用PHP做这件事的

我认为这三个类中没有任何继承。一首歌是一张专辑吗?不,我不认为这是如此的歌曲不应该从专辑继承。专辑是艺术家吗?不,我也不这么认为,所以这张专辑不应该继承艺术家的作品


相反,您希望查看封装。一张专辑引用了零个或多个艺术家。一张专辑包含零首或多首歌曲。艺术家引用零个或多个相册。

一个相册有一个或多个艺术家对象。继承意味着一张专辑是艺术家。您需要的是(编辑)聚合:

class Album
{
  public $artists = array(); // Array of Artist instances
  public $songs   = array(); // Array of Song instances
}

聚合意味着每个艺术家和歌曲实例可能属于其他专辑。就构图而言,艺术家或歌曲可能属于一张专辑。

我不确定您是否正确使用了OOP。通常,当对象具有与父对象相同的功能,但有一些额外(或特定)的功能时,它会扩展父对象

例如,让我们使用汽车行业:

class Automobile {}

class Truck extends Automobile {}
class Car extends Automobile {}

class Lexus extends Car{}
看看雷克萨斯是如何最具体的,所以它建立了一个层次结构,因为它上升

你想要的就像是一个有很多关系的人。一个艺术家有许多专辑,一张专辑有许多歌曲,等等

编辑1:如前所述,您需要


编辑2:如评论中所述,您确实需要。提供的文章解释了两者之间的区别。

试着从哪些对象具有哪些属性的角度来思考。即“汽车有一种颜色”或“气球有一条线”

这首歌有一位艺术家

专辑包含歌曲

因此,您的歌曲类将有一个艺术家对象,而您的唱片集类将包含一组歌曲对象。

以下是我的观点

唱片集包含歌曲,但歌曲不是唱片集。
相册与艺术家关联,但相册不是艺术家


你将继承与关系混为一谈。

不要将继承用于这种关系,因为这一切都是油炸的,都是美味的奶油

歌曲不是专辑的延伸,而是专辑的一部分。同样,专辑也不是艺术家的延伸,而是由艺术家创作的。此外,一首歌可以出现在多张专辑中,一张专辑可以有多个艺术家


在这种情况下,您应该使用has-a关系而不是继承。例如,您可能有一个唱片集对象,其中包含一组歌曲对象作为成员。这将传达歌曲属于专辑的想法。

这听起来像是一个数据库建模问题,而不是OOP问题。这是因为你很可能有一个歌曲艺术家和专辑数据库。不是类层次结构。

继承关系被命名为“IS-a”
,而您要查找的关系是具有-a

你需要这样的东西:

Album
    artists: Artist[1..*]
    songs  : Song[1..*]

如果一张专辑有1到多个(*)艺术家(由艺术家数组定义),一张专辑有1到多首(*)歌曲(由歌曲数组定义)

正如我在一篇评论中提到的,如果你必须通过OOP对其建模,我会说

class Song {
    string[] artists;
    string title;
    int genre;
}

class Album {
    Song[] tracks;
}

喜欢组合而不是继承

照你说的,应该是这样的:

相册对象具有一个或多个艺术家对象。唱片集对象具有一个或多个歌曲对象

班级相册 { 艺术家[]艺术家; 歌曲[]歌曲; }

然而,这并不是我想象的那样。我认为每张专辑都有一首或多首由一位或多位艺术家演唱的歌曲。我想这样做:

班级相册 { 歌曲[]歌曲; //其他相册特定属性 }

班歌 { 艺术家[]艺术家; //其他特定于歌曲的属性 }

班主任 { //艺术家特有的属性 }


我强烈建议您了解OOD原则。

如果您让我们知道您希望实现的目标,这可能会帮助我们找到正确的答案。但是,这些关系通常会存储在您的数据库中。

我确信继承不是您所寻找的,它不是您所谈论的关联。这似乎是一个适合关系数据库答案的问题的教科书示例。歌曲、艺术家和专辑之间都有多对多的关系。一首歌可以有多个艺术家,并出现在多张专辑中。一张专辑可以有许多艺术家。当然,艺术家和专辑都有很多歌曲。你对这个项目有什么特别的问题吗,还是你只是想理解“一般”?因为,没有“一般”模型;每个模型都将适合您特定的项目需求。我不会这么说。在谈到继承或组合时,数据库并没有什么特别之处。我想他只是对OOP的理解有点困惑。非常正确。特别是自从ORM将数据转化为对象以来。艺术家、歌曲和专辑对象的域模型是无知的,与持久化层不同,例如数据库,这并没有什么错。这个模型并没有真正指出哪些艺术家参与了哪些歌曲。我认为最好有像
类歌曲{string[]艺术家;string name;int-genre}
以及
类专辑{Song[]歌曲;string目录;string publisher}
+1这样的东西,这可能是说出其他几个人(包括我自己)所说的最清楚的方式也说过。这不是一个集合吗?@Gordon:一首歌可能会出现在几张专辑上。艺术家可以参与