找出方法是否通过特征调用?

时间:2015-05-22 18:06:22

标签: php traits

在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');

2 个答案:

答案 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();