了解OOP的概念

时间:2019-01-27 18:50:23

标签: php oop object object-oriented-analysis

为可能非常简单的问题道歉。我试图了解OOP。我已经看过教程,但是其中许多教程都非常简化,通过给自己一个“真实的”项目,我遇到了很多教程似乎都无法涵盖的障碍。我有点希望了解以下情况:

如果我制作的是非常基本的体育游戏(例如FIFA),那么我目前有3个对象:

  • 沥青目标
  • 团队目标
  • 播放器对象

我触碰到了我的第一个了解壁垒,因为我不想让玩家简单地成为团队的延伸。毕竟,在现实生活中,我们都是人类的对象,具有的属性会告诉我们我们属于哪个团队,然后再成为团队的子对象。

最佳做法是什么?

我应该是:

  1. 创建玩家的对象,然后将每个对象添加到针对团队对象存储的数组中?这就是我将按程序进行的方式。
  2. 将团队与玩家对抗。
  3. 让球员与球队对抗。
  4. 逐队扩大球员(除非实际完成,否则我想避免这种情况)

这只是现在的大脑练习,所以我真的没有代码,但是

$team1 = new teamObject('red');

$player1 = new players('John'); 
$team1->addToTeam($player1); 

这让我印象深刻,因为它无法工作,因为在teamObject类中,我无法在传递的播放器函数上调用任何播放器类函数吗?

2 个答案:

答案 0 :(得分:2)

这对我来说通常是合理的:

$team1 = new teamObject('red');
$player1 = new players('John'); 
$team1->addToTeam($player1); 

虽然通常看起来可能更像这样(但实际上是同一回事):

$team1 = new Team('red');
$player1 = new Player('John'); 
$team1->addPlayer($player1); 
  

这让我印象深刻,因为它无法工作,因为在teamObject类中,我无法在传递的播放器函数上调用任何播放器类函数吗?

您当然可以调用播放器功能,因为在将播放器添加到团队后,团队将引用该播放器。它可以通过该引用简单地调用播放器函数。团队中的职能可能使用:

$this->players[0]->pretendToBeHurt();

在这种情况下,您绝对不想扩展团队。

答案 1 :(得分:1)

根据我的经验,许多初学者由于担心上过多的课而犯错。他们试图通过继承以某种方式“节省空间”,并最终以无意义的对象表示形式。

您正确地假设玩家不是团队的延伸。这些是2个不同的实体,因此无法接近4。

这些数据结构相互保留的方式实际上取决于实际的实现和数据模型。我不知道您对数据库和数据模型有多熟悉,但是我们这里是一个多对多关系:一个团队有很多球员,一个球员可以(在他的过程中生涯)属于多个团队。

如何在PHP对象中实现此关系只是您要使用的方式。您还会发现经常使用方法2和方法3将这些对象同时放在两个位置。

  • 您需要与团队中的所有球员一起工作吗?在Team对象中存储了一组玩家。
  • 您需要球员职业生涯中所有球队的名单吗?在Player对象中具有一组团队。
  • 您需要当前的球员团队吗?在Player中只有一个Team对象。
  • 您需要作为队长的球员吗?在团队中只有一个玩家对象。

是的,那么您将拥有以下方法:

$player->addToTeam($team1);

$team->addPlayer($player);

$team->addPlayers([
    $player1,
    $player2
]);

(作为一个旁注,请看一下PSR编码标准,以大写形式和单数形式命名您的类:PlayerTeamPitch。尽快获得回报。)