我想知道在从类内部调用方法时是否有办法访问信息。
这里我有一个使用__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()
但是,没有提供我正在寻找的任何信息。
答案 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
。