Aufrufende Methode herrausfinden

hoctar

Erfahrenes Mitglied
Hallo :)

Bräuchte hilfe :)

Wenn man b::callHallo aufruft, soll die tiefste methode angezeigt werden, die gerade aufgerufen wird. In diesem Fall 'callHallo'.

PHP:
abstract class A {

        function hallo() {

                throw new Exception('error in '.__METHOD__);

        }

}

class B extends A {

        function callHallo() {

                $this->hallo();  // <- Hier soll nun in __METHOD__ 'callHallo' stehen

        }

}

$b = new B();
$b->callHallo();
 
Ab PHP53 gibts get_called_class().
Für PHP52 hat mal jemand die Funktion erstellt
http://www.php.net/manual/de/function.get-called-class.php#93799

PHP:
<?php

/********************************
 * Retro-support of get_called_class()
 * Tested and works in PHP 5.2.4
 * http://www.sol1.com.au/
 * http://www.php.net/manual/de/function.get-called-class.php#93799
 ********************************/
if(!function_exists('get_called_class')) {
    function get_called_class($bt = false,$l = 1) {
        if (!$bt) $bt = debug_backtrace();
        if (!isset($bt[$l])) throw new Exception("Cannot find called class -> stack level too deep.");
        if (!isset($bt[$l]['type'])) {
            throw new Exception ('type not set');
        }
        else switch ($bt[$l]['type']) {
            case '::':
                $lines = file($bt[$l]['file']);
                $i = 0;
                $callerLine = '';
                do {
                    $i++;
                    $callerLine = $lines[$bt[$l]['line']-$i] . $callerLine;
                } while (stripos($callerLine,$bt[$l]['function']) === false);
                preg_match('/([a-zA-Z0-9\_]+)::'.$bt[$l]['function'].'/',
                            $callerLine,
                            $matches);
                if (!isset($matches[1])) {
                    // must be an edge case.
                    throw new Exception ("Could not find caller class: originating method call is obscured.");
                }
                switch ($matches[1]) {
                    case 'self':
                    case 'parent':
                        return get_called_class($bt,$l+1);
                    default:
                        return $matches[1];
                }
                // won't get here.
            case '->': switch ($bt[$l]['function']) {
                    case '__get':
                        // edge case -> get class of calling object
                        if (!is_object($bt[$l]['object'])) throw new Exception ("Edge case fail. __get called on non object.");
                        return get_class($bt[$l]['object']);
                    default: return $bt[$l]['class'];
                }
   
            default: throw new Exception ("Unknown backtrace method type");
        }
    }
}
?>
 
Zurück