【问题标题】:Getting a class name from iside a another classe's method从另一个类的方法中获取类名
【发布时间】:2014-08-29 04:57:46
【问题描述】:

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

示例。

这里我有一个类,带有__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()

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

【问题讨论】:

标签: php oop magic-methods static-classes


【解决方案1】:

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

【讨论】:

  • 这个输出将是Caller,而OP希望它是Reader。这似乎是一个有趣的问题。
  • 该死!我回答后他编辑了问题!!!!之前他写的Caller是预料之中的。
  • @hek2mgl 抱歉 :) 我没有整体改变问题。只是一些逻辑
  • @CONtext 你完全抹杀问题的意思。下次,问你是什么意思,这样你就不会像这样浪费别人的时间了。
  • 我只是想表明我考虑了继承。也许您甚至不希望在现实生活中出现这种情况。但是,更好的方法是将调用类作为参数传递给函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多