PHP > Как разделить класс на несколько классов?

У меня очень большой PHP-класс под названием "Player".

Внутри много функций (почти 2000 строк). На самом деле, я использую эти функции следующим образом:

$player = new Player(1)
echo $player->getLogin();
echo $player->getStatisticPerception();
echo $player->getWeaponId();
echo $player->attackPlayerId(3,$player->getWeaponId());

Я думаю, что было бы неплохо разделить этот класс на несколько классов, но я не знаю как. Как я могу создать что-то вроде, например:

$player = new Player(1);
echo $player->getLogin();
echo $player->statistics->getAttack();
echo $player->stuff->getWeaponId();
echo $player->doAction->attackPlayerId(3, $player->getWeaponId());

Если мне кажется, что мне нужно создать объект внутри этого объекта, но если я это сделаю, я не могу получить доступ к основным данным объекта "$player" (например, в Stuff Object, я не могу получить доступ к $ переменная уровня объекта Player.)

3 ответа

Решение

Вы можете создать несколько предложений, как PlayerStatistics, Weapon а также PlayerActions и свяжите их с Классом Игрока... пример:

class Player{
    private Statistics; 
    private Weapon;

    function __construct(){
        $this->Statistics = new Statistics($this);
        $this->Weapon = new Weapon($this);
    }

    function getAttack(){
        return $this->Statistics->getAttack();
    }
}

class Statistics{
    private Player;
    function __construct($_player){
         $this->Player = $_player;
    }
}

что-то в этом роде... это композиция или агрегация объектов, в зависимости от отношения между объектами.

Надеюсь это поможет

Вы можете использовать наследование классов

Class Player {
  protected $level;
  public $stuff;
  function __construct() {
    $this->stuff = new Stuff();
  }
}

Class Stuff extends Player {
  function getWeaponId() {
    // You can access Player's $level here using $this->level
  }
}

В такой строке:

echo $player->statistics->getAttack();

Вы получаете доступ к statistics член класса Player. Чтобы использовать цепочку, эта переменная также должна быть объектом. Вы можете создать отдельный класс статистики, который включает в себя getAttack метод. Затем в конструкторе класса Player инициализируйте $this->statistics к экземпляру класса Статистика.

Аналогично для stuff а также doActionони должны быть объектами. Хотя я не уверен, что они действительно подходящие кандидаты на отдельные объекты.

Другие вопросы по тегам