CodeChap
CodeChap

Reputation: 4262

Find the class name of the calling function in php

Lets say I have:

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

How do I get "water" from the zebra class?

(This is for php 5.3)

Upvotes: 1

Views: 3817

Answers (3)

Loïc BRIED
Loïc BRIED

Reputation: 11

Full usable solution using exception, but not debug_backtrace, no need to modify any prototype :

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

Upvotes: 1

Ravi
Ravi

Reputation: 737

You can get the caller's info from debug_backtrace http://php.net/manual/en/function.debug-backtrace.php

Upvotes: 3

DhruvPathak
DhruvPathak

Reputation: 43235

One not so good solution is : use __METHOD__ or __FUNCTION__ or __CLASS__ . and pass it as parameter to function being called. 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();

?>

Upvotes: 1

Related Questions