【问题标题】:Get the name of the method that called another method获取调用另一个方法的方法的名称
【发布时间】:2013-11-29 02:16:30
【问题描述】:

目标

获取调用另一个方法的方法的名称。

问题

我需要在另一个方法中获取一个方法名,现在我正在使用这个:

$crazyDinosaur = new CrazyDinosaur(300, 600);
$crazyDinosaur->attack(new NinjaCat(), __FUNCTION__);

如果没有__FUNCTION__,我怎样才能发现CrazyDinosaur 攻击了NinjaCat?有可能吗?

更多详情

我真正想要的是:x 触发一个事件。我不想再说x触发了事件,因为事件应该知道是谁触发了自己。

【问题讨论】:

  • $crazyDinosaur->attack(new NinjaCat(), $crazyDinosaur); ???
  • 一般来说你的代码是最简单的方法。请参阅stackoverflow.com/questions/2110732/… 它可能会对您有所帮助。
  • attack的方法里面有没有办法发现是谁攻击了NinjaCat?

标签: php


【解决方案1】:

您通常会有一个抽象的ActorCharacter 类,对它们进行子类化,然后创建子类的实例。例如:

<?php
abstract class Actor {}

abstract class Animal extends Actor {}

class Dinosaur extends Animal {}

如您所知,类可以具有属性。因此,一个属性可能是$type,它包含该类的字符串表示形式。因此,如果您创建了Dinosaur 的实例,$type 可能只是dinosaur

所以现在我们有:

<?php
abstract class Animal extends Actor
{
    protected $type;
}    

class Dinosaur extends Animal
{
    protected $type = 'dinosaur';

    public function getType()
    {
        return $this->type;
    }
}

class Cat extends Animal
{
    protected $type = 'cat';
}

$crazyDinosaur = new Dinosaur();
$crazyCat = new Cat();

我认为您的问题是您将 attack() 方法附加到了错误的类;我会把它附加到受害者的课堂上。因此,如果恐龙正在攻击猫,那么我将调用 cat 类的 attack() 方法,并将您的恐龙对象作为参数传递。这样,您只需检查 $attacker 是什么类型的类,就知道什么在攻击什么。

<?php
class Cat extends Animal
{
    public function attack(Actor $attacker)
    {
        // code here to do things like deduct cat's health etc.
    }
}

$crazyDinosaur = new Dinosaur();
$crazyCat = new Cat();

$crazyCat->attack($crazyDinosaur);

您可以扩展您的 attack 方法以接受其他参数。例如,攻击的强度会改变它对受害者造成的伤害量。

我还建议查看Observer pattern,因为在这种情况下这是理想的选择。此外,PHP 不是事件驱动语言,因此不是最适合游戏的语言。

【讨论】:

  • 你这句话$crazyCat-&gt;attack($crazyDinosaur);听起来很奇怪。但我明白你的观点。请稍等,自己尝试一下。
  • 这不是游戏,哈哈…… 实际上,它是一个ErrorHandler。当错误发生时,我需要知道它发生在哪里。我传递给 Stack Overflow 的上下文更容易理解,而且场景几乎相同。
  • 你真的不应该改变问题的上下文,否则我会向你指出 debug_backtrace() 函数,而不是根据游戏编写复杂的答案。
【解决方案2】:

这个怎么样

class creature{

public $attack_strength;
public $health ;

public function attack($enemy){
  $damage = $this->attack_strength;
  $enemy->health -= $damage;
  log_event($this->name . " attacked " . $enemy->name . " making " . $demage . " points of damage");
}
}

class NinjaCat extends creature{

}

class crazyDinosaur extends creature{

}

【讨论】:

  • 你的逻辑很好,我们快到了。但我真正想要的是:x 触发一个事件。我不想再说x触发了事件,因为事件应该知道是谁触发了自己。
【解决方案3】:

我想你在找get_class($this):

...
function attack($victim)
{
  $attacker = get_class($this);
  var_dump($attacker);
}
...

【讨论】:

  • 否定。我想“传递”类/方法/函数名称只是触发一个方法。示例:$say-&gt;hi();hi() 的方法中我发现$say 是触发器。
  • @GuilhermeOderdenge 这样的事情? stackoverflow.com/questions/19135959/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 2017-04-19
  • 2014-07-11
  • 1970-01-01
相关资源
最近更新 更多