【问题标题】:Relationship between parent and child object父子对象之间的关系
【发布时间】:2019-08-20 01:25:19
【问题描述】:

我正在使用 PHP OOP 创建一个小型应用程序,并且正在为子对象如何关联或作为父对象的一部分而苦苦挣扎。

我有一个 Team 对象和一个扩展 Team 的 Player 对象。我有一些团队对象和许多玩家对象,我希望玩家对象成为特定团队对象的一部分。例如:

我想我正在努力理解我应该如何处理这个问题。我想要的示例:

  • 我使用名为“巴西”的对象实例化 Team 类
  • 我用名为“玩家一,玩家二”的对象多次实例化 Player 类
  • 我希望我的应用了解 Player one 对象是巴西对象的子对象
  • 然后,例如,当我在表单中选择巴西时,我想列出属于巴西对象的所有球员等

目前我没有在数据库中存储任何东西,只是代码。在这一点上,我的代码实际上真的很乱,我觉得它没有帮助

class Team {

    private $TeamName;

    /**
     * @return mixed
     */
    public function getTeamName()
    {
        return $this->TeamName;
    }

    /**
     * @param mixed $TeamName
     */
    public function setTeamName($TeamName)
    {
        $this->TeamName = $TeamName;
    }

}


class Player extends Team
{

    private $playerName;

    private $position;

    /**
     * @return mixed
     */
    public function getPlayerName()
    {
        return $this->playerName;
    }

    /**
     * @param mixed $playerName
     */
    public function setPlayerName($playerName)
    {
        $this->playerName = $playerName;
    }

    /**
     * @return mixed
     */
    public function getPosition()
    {
        return $this->position;
    }

    /**
     * @param mixed $position
     */
    public function setPosition($position)
    {
        $this->position = $position;
    }

    /**
     * @return mixed
     */
    public function getTeamName()
    {
        parent::getTeamName();
    }

    /**
     * @param mixed $TeamName
     */
    public function setTeamName($TeamName)
    {
        parent::setTeamName($TeamName);
    }
}

【问题讨论】:

  • 首先,玩家不是团队,但是玩家拥有团队。所以让玩家继承Team是不正确的,而是在Player类中有一个team属性。
  • 啊哈,这很有道理。所以基本上我不应该扩展 Team 类。在 player 中有一个 team 属性,这是否实际上使 Team 类变得多余?
  • “所以基本上我不应该扩展 Team 类”...是的。 “这实际上使 Team 类变得多余”...不,您创建新的团队对象并在同一团队的所有玩家对象之间共享它(同一个团队对象),我会给你是答案中的一个例子。

标签: php oop


【解决方案1】:

一个玩家不是一个团队,所以让它继承团队没有意义,你应该有一个团队作为一个玩家的属性,在这里我将你的代码调整为我的想法是对的

<?php
class Team {

    private $TeamName;

    protected $players = [];

    public function __construct($teamName)
    {
        $this->setTeamName($teamName);
    }


    public function addPlayer(Player $player)
    {
        $this->players[] = $player;
        $player->setPlayerTeam($this);
    }

    public function getAllPlayers()
    {
        return $this->players;
    }

    /**
     * @param mixed $TeamName
     */
    public function setTeamName($TeamName)
    {
        $this->TeamName = $TeamName;
    }

    /**
     * @return mixed
     */
    public function getTeamName()
    {
        return $this->TeamName;
    }

}



class Player
{

    private $playerName;

    private $position;

    protected $team;

    public function __construct($playerName, $position)
    {
        $this->playerName = $playerName;
        $this->position = $position;
    }

    public function setPlayerTeam(Team $team)
    {
        $this->team = $team;
    }

    /**
     * @return mixed
     */
    public function getTeamName()
    {
        return $this->team->getTeamName();
    }

    /**
     * @return mixed
     */
    public function getPlayerName()
    {
        return $this->playerName;
    }

    /**
     * @param mixed $playerName
     */
    public function setPlayerName($playerName)
    {
        $this->playerName = $playerName;
    }

    /**
     * @return mixed
     */
    public function getPosition()
    {
        return $this->position;
    }

    /**
     * @param mixed $position
     */
    public function setPosition($position)
    {
        $this->position = $position;
    }




}

测试类

$brazil = new Team("Brazil");
$player1 = new Player("player1", "defender");
$player2 = new Player("player2", "attacker");

$brazil->addPlayer($player1);
$brazil->addPlayer($player2);

$brazilPlayers = $brazil->getAllPlayers();
foreach ($brazilPlayers as $player) echo $player->getPlayerName() . "\n";

exit;

这个输出

player1 
player2 

查看live demo

【讨论】:

  • 这很好,谢谢你的额外解释。所以只是为了澄清一点,你说一个球员不是一个团队,所以不应该扩展 Team 类。那么用 AsianTeam、AfricanTeam 等扩展 Team 类是否有意义?
  • @BehzadLashkari 欢迎您。 “那么用 AsianTeam、AfricanTeam 等扩展 Team 类是否有意义”....是的,如果 AsianTeam 具有 Team PLUS 的所有属性,AsianTeam extends Team 就有意义他自己的额外属性和功能。如果 AsianTeam 不需要比 Team 额外的属性或功能,那么它应该是一个 vanilla Team。
【解决方案2】:

也许你可以像这样拥有你想要的东西?

class Player
{

    private $players = [];

    private $position;


    /**
     * @return mixed
     */
    public function getPlayers()
    {
        return $this->players;
    }

    /**
     * @param $playerName
     */
    public function setPlayerName($playerName)
    {
        $this->players[] = $playerName;
    }

    /**
     * @return mixed
     */
    public function getPosition()
    {
        return $this->position;
    }

    /**
     * @param mixed $position
     */
    public function setPosition($position)
    {
        $this->position = $position;
    }
}



class Team extends Player{

    private $TeamName;

    /**
     * Team constructor.
     * @param $TeamName
     */
    public function __construct($TeamName)
    {
        $this->setTeamName($TeamName);
    }        

    /**
     * @return mixed
     */
    public function getTeamName()
    {
        return $this->TeamName;
    }

    /**
     * @param mixed $TeamName
     */
    public function setTeamName($TeamName)
    {
        $this->TeamName = $TeamName;
    }

}



$brazil = new Team('Brazil');
$brazil->setPlayerName('Joe');
$brazil->setPlayerName('Sam');
print_r($brazil->getPlayers());
print_r($brazil->getTeamName());

【讨论】:

    【解决方案3】:

    可能是这样的:

    class Team {
    
        private $TeamName;
        private $Players = [];
    
        /**
         * @return mixed
         */
        public function getTeamName()
        {
            return $this->TeamName;
        }
    
        /**
         * @param mixed $TeamName
         */
        public function setTeamName($TeamName)
        {
            $this->TeamName = $TeamName;
        }
    
        public function getPlayers() {
            return $this->Players;
        }
    
        public function setPlayers($player) {
            $this->Players[] = $player;
        }
    
    }
    
    
    class Player extends Team
    {
    
        private $playerName;
    
        private $position;
    
        private $team;
    
        /**
         * @return mixed
         */
        public function getPlayerName()
        {
            return $this->playerName;
        }
    
        /**
         * @param mixed $playerName
         */
        public function setPlayerName($playerName)
        {
            $this->playerName = $playerName;
        }
    
        /**
         * @return mixed
         */
        public function getPosition()
        {
            return $this->position;
        }
    
        /**
         * @param mixed $position
         */
        public function setPosition($position)
        {
            $this->position = $position;
        }
    
        public function getTeam() {
            return $this->Team;
        }
    
        public function setTeam(Team $team) {
            $this->team = $team->getTeamName();
            $team->setPlayers($this->playerName);
        }
    }
    
    $team = new Team();
    $team->setTeamName("Brazil");
    
    $player1 = new Player();
    $player1->setPlayerName("Player One");
    $player1->setPosition("Attacker");
    $player1->setTeam($team);
    
    $player2 = new Player();
    $player2->setPlayerName("Player Two");
    $player2->setPosition("Keeper");
    $player2->setTeam($team);
    

    并通过$team-&gt;getPlayers()获得团队成员

    【讨论】:

      猜你喜欢
      • 2020-06-01
      • 1970-01-01
      • 2017-09-05
      • 2016-02-08
      • 2011-03-08
      • 1970-01-01
      • 2021-08-26
      • 2012-10-17
      • 2021-01-22
      相关资源
      最近更新 更多