在PHP中,如何通过从特征继承的方法调用类方法?
假设我有一个使用myClass
的课程Psr\Log\LoggerTrait
(请参阅:PSR-3)。我需要能够找出方法myClass::log()
是通过Psr\Log\LoggerTrait
中的方法调用的,例如LoggerTrait::debug()
,还是直接从外部调用myClass
所有方法都是非静态的。
这与调试包有关。我不是试图改变基于调用者的行为,我只需要能够向前传递信息。更确切地说,我只需要切入点,即。只是我包裹外的最后一次电话。
我在看debug_backtrace()
,但它似乎没有提供任何直接的解决方案。有没有理性的方法呢?
以下是一些代码:
<?php
class myClass
{
use Psr\Log\LoggerTrait;
public function log($level, $message, array $context = array())
{
if (called_via_trait) {
...
} else {
...
}
}
}
$myObject = new myClass;
$myObject->log('debug', 'This is a direct call');
$myObject->debug('This is a call via a trait method');
答案 0 :(得分:1)
您可以使用get_called_class来确定调用它的类。
trait Test {
public function doTest() {
echo get_called_class() . "\n";
}
}
class Some {
use Test;
public function myFunc() {
$this->doTest();
}
}
$some = new Some();
$some->myFunc(); // Outputs "Some" since Some uses Test
所以在你的情况下,在课堂上,你可以做类似
的事情function test() {
if(get_called_class() == 'myClass') {
// You're in the myClass class
} else {
// You're not in the myClass class
}
}
答案 1 :(得分:0)
是的,您必须使用debug_backtrace();
请按照我的示例:
namespace Psr\Log;
class LoggerTrait{
public static function debug(){
return myClass::log();
}
}
class myClass{
public static function log(){
$trace = debug_backtrace();
if(isset($trace[1])){
echo'<br />Called by <b>'.$trace[1]['class'].'</b>. ';
} else {
echo'<br />Called by <b>'.$trace[0]['class'].'</b>. ';
}
if(isset($trace[1]['class']) && $trace[1]['class']!=get_class()){
echo'Called outside';
} else {
echo'Called inside';
}
//return get_class();
}
}
trait ExampleTrait {
public function doSay() {
echo LoggerTrait::debug();
echo myClass::log();
}
}
echo LoggerTrait::debug();
echo myClass::log();
echo ExampleTrait::doSay();