<?php class test { public function getCaller($stack = 2) { ob_start(); debug_print_backtrace(); $bt = ob_get_contents(); ob_end_clean(); $bt = str_replace(array('->', '::'), ' ', substr($bt, strpos($bt, "#$stack "))); $bt = substr($bt, 0, strpos($bt, '(')); $bt = sscanf($bt, "#$stack %s %s"); $pos = ($bt[1] == NULL) ? 0 : 1; return trim($bt[$pos]); } public function test1() { echo "Inside test1()\n"; $this->{(($c=$this->getCaller(1))?substr($c,0,(strlen($c)-1)).($c{(strlen($c)-1)}+1):false)}(); } public function test2() { echo "Inside test2()\n"; $this->{(($c=$this->getCaller())?substr($c,0,(strlen($c)-1)).($c{(strlen($c)-1)}+2):false)}(); } public function test3() { echo "Inside test3()\n"; } } $test = new test(); $test->test1(); /*********************** Output: $ php test5.php Inside test1() Inside test2() Inside test3() ************************/