PHP> Как разделить класс на несколько классов? - PullRequest
1 голос
/ 31 октября 2011

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

Ответы [ 3 ]

1 голос
/ 31 октября 2011

вы можете создать несколько предложений вроде 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;
    }
}

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

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

0 голосов
/ 31 октября 2011

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

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

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

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

0 голосов
/ 31 октября 2011

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

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
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...