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