【发布时间】:2012-10-18 08:34:31
【问题描述】:
到目前为止,我觉得我已经理解了 OOP 编程的概念和优点,而且我在理解如何使用 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 而不指向任何特定的方法或属性时,您是在引用整个类吗?
如果这是正在发生的事情,那我为什么要这样做?如果我在我的游戏类中创建了一个玩家,那么我当然可以在游戏类中访问我的玩家属性和方法,对吧?为什么我希望我的游戏类也包含在我的 Player 类中?例如,我可以在 Player 类中调用 createPlayer() 吗?
如果我的解释令人困惑,我深表歉意。
我想我的问题可以归结为:我作为参数传递的究竟是什么,为什么我要在每天的 OOP 编程中这样做?
【问题讨论】:
-
在某些时候他必须使用
Player类中的变量$g。构造函数中的单词Game是type hint,它强制只在该参数中传递Game类的对象。其他任何事情都会引发异常。 -
添加
Class Player extends Game不是更合乎逻辑吗?我不是PHP专家,但为什么会这样呢? -
@AngeloA
Player没有扩展Game,而是Game是Player的依赖项。在Player构造函数中,Game的公共 API 将通过$g变量提供 -
“为什么我希望我的游戏类也包含在我的 Player 类中?” 这通常用于创建双向关联