Funktionsnamen ermitteln

Lefti1

Grünschnabel
Hallo,

wie kann ich innerhalb einer Klasse den Namen der aufrufenden Funktion (außerhalb der Klasse) ermitteln.

Ich erkläre es am Besten an diesem Beispiel:
PHP:
<?php

	class clTest1
	{
		function MacheWas()
		{
			echo "wer hat mich aufgerufen?<br>";
			echo __METHOD__;
		}
	}
	
	class clTest2
	{
		// Ich rufe
		function Aufrufer()
		{
			$cTest1 = new clTest1();
		
			$cTest1->MacheWas();
		}
	}
	
	$cTest2 = new clTest2();
	
	$cTest2->Aufrufer();
	
?>

Über __METHOD__ bekomme ich den eigenen Funktionsnamen heraus. (Es sollte allerdings "Aufrufer" rauskommen).
Gibt es eine Möglichkeit den aufrufenden Funktionsnamen herauszufinden, ohne __METHOD__ per Parameter zu übergeben?
Also direkt in der Funktion "MacheWas" der Klasse "clTest1".
 
Hallo Lefti1,

das müsste mir der Funktion [phpf]debug_backtrace[/phpf] gehen, dir die vorhergehenden Aufrufe ausgibt.

Wenn du in der Funktion MacheWas() [phpf]debug_backtrace[/phpf] einfügst und ausgibst, bekommst du folgende Ausgabe:
PHP:
// Ausgeführt auf codepad.org: http://codepad.org/T2LHViWm
function MacheWas()
{
  $backtrace = debug_backtrace();
  var_dump($backtrace);
}
Code:
array(2) {
  [0]=>
  array(7) {
    ["file"]=>
    string(6) "/t.php"
    ["line"]=>
    int(19)
    ["function"]=>
    string(8) "MacheWas"
    ["class"]=>
    string(7) "clTest1"
    ["object"]=>
    object(clTest1)#2 (0) {
    }
    ["type"]=>
    string(2) "->"
    ["args"]=>
    array(0) {
    }
  }
  [1]=>
  array(7) {
    ["file"]=>
    string(6) "/t.php"
    ["line"]=>
    int(25)
    ["function"]=>
    string(8) "Aufrufer"
    ["class"]=>
    string(7) "clTest2"
    ["object"]=>
    object(clTest2)#1 (0) {
    }
    ["type"]=>
    string(2) "->"
    ["args"]=>
    array(0) {
    }
  }
}
Also steht in $backtrace[1]["function"] die Funktion, die die aktuelle Funktion aufgerufen hat!
PHP:
function MacheWas()
{
  $backtrace = debug_backtrace();
  echo 'Mich hat die Funktion "'  .  $backtrace[1]['function']  .  '()" aufgerufen!';
}
Wenn du PHP 5.4.0 hast, würde ich noch das ein Limit angeben:
PHP:
$backtrace = debug_backtrace( DEBUG_BACKTRACE_PROVIDE_OBJECT, 2 );
 
Perfekt,
genau das was ich gesucht habe.

Vielen Dank ComFreek.


die PECL-Extension hab ich nicht installiert.
Danke dir trotzdem saftmeister.
 
Zurück