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

************************/