[英]Getting a class name from iside a another classe's method
我想知道从类内部调用方法时是否有一种访问信息的方法。
在这里,我有一个带有__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()输出。
从类Reader中调用方法foo
因此,问题在于获取从中调用方法的调用名称。
我在foo()内部尝试使用以下方法获取类名:
get_class()
get_parent_class()
get_called_class()
但是,没有人提供我想要的任何信息。
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
但是,这非常不好。 您的应用程序逻辑不应依赖于此。 出于分析目的,您可以使用调试器。
给出的原始答案是因为您首先写的内容是您期望的:
从类Reader中调用方法foo
您需要使用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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.