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

#php #class #object #constructor-chaining

#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 я не могу получить доступ к переменной $level объекта Player.)

Ответ №1:

вы можете создать несколько классов, таких как PlayerStatistics , Weapon и PlayerActions и связать их с классом Player … пример:

 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;
    }
}
 

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

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

Ответ №2:

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

 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
  }
}
 

Ответ №3:

В строке, подобной этой:

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

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

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