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

时间:2013-11-28 17:27:33

标签: php

目标

获取调用其他方法的方法的名称。

问题

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

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

如何在没有CrazyDinosaur的情况下发现NinjaCat攻击__FUNCTION__?有可能吗?

更多详情

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

3 个答案:

答案 0 :(得分: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()方法附加到错误的类;我会把它附在受害者的班级上。因此,如果恐龙攻击猫,那么我会在猫类上调用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不是一种事件驱动的语言,因此不适合游戏。

答案 1 :(得分:0)

这个怎么样

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{

}

答案 2 :(得分:0)

我认为您正在寻找get_class($this)

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