从另一个类方法中获取类名

时间:2014-07-08 12:40:10

标签: php oop magic-methods static-classes

我想知道在从类内部调用方法时是否有办法访问信息。

实施例。

这里我有一个使用__classStatic()方法的类来生成任意方法。

class Caller
{
  public function __callStatic($func, $args){
       echo "method $func is being called from class ..."; 
  }
}

现在,每当一个方法被调用ex:Caller::foo()里面说...一个名为Reader的类,

class Reader{
    Caller::foo(); 
}

我希望`foo()输出。

  

方法foo是从类Reader

调用的

因此,问题是获取调用方法的调用名称。

我在foo()中尝试使用以下方法获取类名:

get_class()
get_parent_class()
get_called_class()

但是,没有提供我正在寻找的任何信息。

1 个答案:

答案 0 :(得分:0)

PHP中没有语言构造来实现这一目标。要做到这一点,您需要分析堆栈跟踪:

class Callee
{
    public static function __callStatic($func, $args){
        $trace = debug_backtrace();
        for($i = 1; $i < count($trace); $i++) {
            $x = $trace[$i];
            if($x['function'] === $func && is_a($x['class'], __CLASS__, true)) {
                continue;
            }
            $class = $x['class'];
            break;
        }
        return "method $func is being called from class $class";
    }
}

class Foo extends Callee
{
}

class Reader
{
  function doSomething(){
      echo Foo::foo();
  }
}

(new Reader)->doSomething();

输出:

method foo is being called from class Reader

然而,这表现非常糟糕。您的应用程序逻辑不应该依赖于此。出于分析目的,您可以使用调试器。


原始答案,因为您第一次写下了您的期望:

  

方法foo是从类Reader

调用的

您需要使用get_called_class()

class Caller
{
  public static function __callStatic($func, $args){
       echo "method $func is being called from class " . get_called_class();
  }
}

另请注意,__callStatic()需要声明static。顺便说一下,班级名Caller听起来很怪异。我想你的意思是Callee