До сих пор я чувствовал, что понял концепцию и преимущества ООП-программирования, и у меня не было никаких трудностей с пониманием того, как работать с классами в PHP.
Тем не менее, это оставило меня немного в замешательстве. Я думаю, что могу понять это, но я все еще не уверен.
Я следил за набором видеоуроков (не уверен в правилах ссылок на внешние ресурсы, но я нашел их на YouTube), и они довольно понятны. За исключением, к сожалению, случая, когда репетитор решил передать один класс в качестве параметра в другом классе. По крайней мере, я так думаю;
Class Game
{
public function __construct()
{
echo 'Game Started.<br />';
}
public function createPlayer($name)
{
$this->player= New Player($this, $name);
}
}
Class Player
{
private $_name;
public function __construct(Game $g, $name)
{
$this->_name = $name;
echo "Player {$this->_name} was created.<br />";
}
}
Затем я создаю объект класса Game и вызываю его метод;
$game = new Game();
$game-> createPlayer('new player');
К сожалению, репетитор на самом деле не объясняет, почему он это сделал, и, насколько я вижу, не отображает никаких вызовов в коде, которые оправдывали бы это.
Является ли конструктор волшебного метода в Player переданным в классе Game в качестве ссылки? Означает ли это, что весь класс доступен внутри класса Player по ссылке? Ссылаясь на $this без указания на какой-либо конкретный метод или свойство, вы ссылаетесь на весь класс?
Если это то, что происходит, то зачем мне это делать? Если я создал игрока внутри своего игрового класса, то, конечно же, я могу просто получить доступ к своим свойствам и методам игрока в игровом классе, верно? Почему я хочу, чтобы мой игровой класс был внутри моего класса игрока? Могу ли я тогда, например, вызвать createPlayer() в классе Player?
Я извиняюсь, если мое объяснение было вообще запутанным.
Я думаю, мой вопрос сводится к; что именно я передаю в качестве параметра, и зачем мне это делать в повседневном ООП-программировании?
$g
внутри классаPlayer
. СловоGame
в конструкторе является подсказкой типа, которая объекты классаGame
передаются в этом параметре. Все остальное вызовет исключение. - person Michael Berkowski   schedule 29.10.2012Class Player extends Game
. Я не эксперт по PHP, но почему это сделано именно так? - person Angelo A   schedule 29.10.2012Player
не расширяетGame
, скорееGame
является зависимостьюPlayer
. Внутри конструктораPlayer
публичный APIGame
будет доступен через переменную$g
. - person Phil   schedule 29.10.2012