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
они должны быть объектами. Хотя я не уверен, что они действительно подходящие кандидаты на отдельные объекты.