到目前为止,我感觉我已经理解了面向对象编程的概念和优势,并且没有什么困难来理解如何在PHP中使用类。然而,这让我有点困惑。我认为我可能明白了,但我仍然不确定。我一直在跟随一系列视频教程(不确定链接到外部资源的规则,但我在YouTube上找到了它们),它们相当简单易懂。除了令人沮丧的是,当教程决定在另一个类中将一个类作为参数传递时。至少我认为是这样。
相当令人沮丧的是,教程并没有真正解释为什么这样做,而且在我看来,代码中也没有任何调用可以证明这样做的理由。
Player类的魔术方法构造函数是否将Game类作为引用传递?这是否意味着整个类都可以通过引用在Player类中访问?当引用$this而不指向任何特定方法或属性时,是否引用整个类?
如果是这样的话,那么我为什么要这样做呢?如果我已经在我的Game类中创建了一个Player,那么我肯定可以在Game类内部访问我的Player属性和方法,对吧?为什么我还要将我的Game类放在我的Player类中呢?比如,我能够在Player类中调用createPlayer()吗?
如果我的解释有些混乱,我向您道歉。
我的问题归结为:我究竟是将什么作为参数传递的,为什么在日常面向对象编程中要这样做?
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而不指向任何特定方法或属性时,是否引用整个类?
如果是这样的话,那么我为什么要这样做呢?如果我已经在我的Game类中创建了一个Player,那么我肯定可以在Game类内部访问我的Player属性和方法,对吧?为什么我还要将我的Game类放在我的Player类中呢?比如,我能够在Player类中调用createPlayer()吗?
如果我的解释有些混乱,我向您道歉。
我的问题归结为:我究竟是将什么作为参数传递的,为什么在日常面向对象编程中要这样做?
Player
类中使用变量$g
。构造函数中的单词Game
是类型提示,它强制只传递Game
类的对象作为该参数。否则会抛出异常。 - Michael BerkowskiClass Player extends Game
添加进去不是更合理吗?虽然我不是 PHP 专家,但为什么要这样做呢? - Angelo APlayer
并没有继承Game
,而是Game
是Player
的一个依赖项。在Player
构造函数内部,可以通过$g
变量访问Game
的公共API。 - Phil