gpt4 book ai didi

php - 将对象传递给新对象

转载 作者:行者123 更新时间:2023-12-02 14:07:26 25 4
gpt4 key购买 nike

$P1 = new Player(array(
'name' => 'Player 1',
'strat' => new Strategy(&$this)
));

这或多或少就是我想要做的。对 $this 的引用显然是错误的。完成这样的事情的最佳方法是什么?

基本上,新的策略对象需要知道它属于哪个玩家。

当然我可以这样做:

$P1 = new Player();
$P1->strat = new Strategy(&P1);

但这似乎并不简洁。

更新:

我想我不会在数组中传递新的策略对象,而是传递策略类的名称,然后在 Player 构造函数中实例化一个新对象。

最佳答案

$P1->strat->owner =$P1;

这就足够了。

<小时/>

谈话正在进行中。
好吧,如果我们从理论和概念的角度来处理这个问题,我们可以用几种不同的方式来解决隐含的问题。让我们考虑一下什么是玩家策略。
顾名思义,策略基本上是一个驱动因素,可能会影响特定环境下游戏的行为。这进一步表明以下方法是有意义的:

$player->useStrategy($strategy);

此外,玩家很可能会在给定范围内行动,因此,它将使用 $strategy 对象作为 Controller ,并将满足任何条件的输入传递给策略行为 Controller 。考虑到玩家可以:
1)帮助确定要开展的事件
2)使用玩家界面来响应策略行为必须应用于的任何操作。

现在,我们可以假设可能存在不同的策略,只要策略类实现了策略接口(interface),这些策略就可以轻松应用于任何玩家。在这种情况下,策略不需要了解有关玩家的任何信息。如果只是,有不同类型的播放器具有不同的界面,允许不同的控制集。但在这种情况下,更明智的做法是为特定播放器类设置扩展类以实现这些播放器提供的额外功能。

class Strategy {
private $player;
public usePlayer($player){
$this->player = $player;
}
public makeNextMove($input){
1) return array($a,$b);
2) return new Behavior_NextMove()->setTarget($a,$b);
3) $this->player->move($a, $b);
}
}

class Strategy_MegaPlayer extends Strategy {
public makeNextMove($input){
parent::makeNextMove($input);
$player->useMegaPlayerSpecialPower();
}
}

或者,可以有集中的策略对象,通过配置接口(interface),根据玩家的类型,根据玩家类型及其配置来决定适当的操作和策略。

但似乎结构合理的战略支持类(class)会让您受益匪浅。

关于php - 将对象传递给新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7588151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com