Найти имя класса вызывающей функции в php - PullRequest
1 голос
/ 15 сентября 2011

Допустим, у меня есть:

    class Zebra{
        public static function action(){
            print 'I was called from the '.get_class().' class'; // How do I get water here?
        }
    }

    class Water{
        public static function drink(){
            Zebra::action();
        }
    }

Water::drink();

Как получить "воду" из класса зебры?

(Это для php 5.3)

Ответы [ 3 ]

3 голосов
/ 15 сентября 2011

Вы можете получить информацию о звонящем от debug_backtrace http://php.net/manual/en/function.debug-backtrace.php

1 голос
/ 28 сентября 2015

Полноценное решение, использующее исключение, но не debug_backtrace, нет необходимости изменять любой прототип:

function getRealCallClass($functionName)
{
  try
   {
     throw new exception();
   }
  catch(exception $e)
   {
     $trace = $e->getTrace();
     $bInfunction = false;
     foreach($trace as $trace_piece)
      {
          if ($trace_piece['function'] == $functionName)
           {
             if (!$bInfunction)
              $bInfunction = true;
           }
          elseif($bInfunction) //found !!!
           {
             return $trace_piece['class'];
           }
      }
   }
}

class Zebra{
        public static function action(){
        print 'I was called from the '.getRealCallClass(__FUNCTION__).' class'; 
    }
}

class Water{
    public static function drink(){
        Zebra::action();
    }
}

Water::drink();
1 голос
/ 15 сентября 2011

Одно не очень хорошее решение: используйте __METHOD__ или __FUNCTION__ или __CLASS__. и передать его в качестве параметра вызываемой функции. http://codepad.org/AVG0Taq7

<?php

  class Zebra{
        public static function action($source){
            print 'I was called from the '.$source.' class'; // How do I get water here?
        }
    }

    class Water{
        public static function drink(){
            Zebra::action(__CLASS__);
        }
    }

Water::drink();

?>
...