Wiederholter Methodenaufruf

time-master

Erfahrenes Mitglied
Hallo..
Ich habe ein Problem und finde einfach keine Lösung.. Ich möchte eine Funktion, die in einer Klasse ist, vor jedem anderen Funktionsaufruf der Klasse ausführen..
Ein Beispiel..


PHP:
class Klasse 
{ 
  private $counter; 

  public function __construct () 
  { 
	$this->counter = 0; 
  } 

  private function IchWillImmerAufgerufenWerden () 
  { 
	print ++$this->counter; 
  } 

  public function Test1 () 
  { 
	print " x aufgerufen!<BR>"; 
  } 

  public function Test2 () 
  { 
	print " x aufgerufen!<BR>"; 
  } 
} 

$cls = new Klasse () 
$cls->Test1 (); 
$cls->Test2 (); 
/* 

Ausgabe soll sein: 
1 x aufgerufen! 
2 x aufgerufen! 

*/


Das ich die Funktion "IchWillImmerAufgerufenWerden" in den Funktionen "Test1" und "Test2" einfach nur aufrufen könnte weiss ich.. nur das möchte ich nicht, weil meine Klasse vererbt werden soll und ich daher nicht weiss wie die Funktionen heißen werden!
 
PHP:
public function Test1 ()
  {
    $this->IchWillImmerAufgerufenWerden(); 
    print " x aufgerufen!<BR>";
  }

  public function Test2 ()
  {
    $this->IchWillImmerAufgerufenWerden(); 
    print " x aufgerufen!<BR>";
  }
So vielleicht? Denn eine andere Möglichkeit wäre mir auch neu. ( oder sie fällt mir gerade nicht ein :-( )

greetz
daddz
 
Du könntest deine Methodennamen intern mit einem Präfix (z.B. einem Unterstrich) versehen und sie auf private setzen. Methodenaufrufe von außerhalb werden dann über die „magische Methode“[1] __call abgehandelt, die immer dann in Aktion tritt, wenn eine Methode aufgerufen wird, die nicht existiert. Darin führen wir zuerst IchWillImmerAufgerufenWerden und anschließend die tatsächliche Methode (durch voranstellen des Präfixes) aus.

[1] „magische Methode“ deshalb, weil sie selbstständig von PHP zum geeigenten Zeitpunkt aufgerufen wird


Verwirrt? Gut, dann gibt's gleich noch etwas Quelltext:
PHP:
<?php

class Klasse
{
	private $counter;
	
	public function __construct()
	{
		$this->counter = 0;
	}
	
	private function IchWillImmerAufgerufenWerden()
	{
		print ++$this->counter;
	}
	
	public function __call($method, $args)
	{
		if (!method_exists($this, '_'.$method)) {
			// Die angeforderte Methode ist nicht implementiet
			// => Fehler!
			trigger_error('Call to undefined method '.$method,
				E_USER_ERROR);
		}

		$this->IchWillImmerAufgerufenWerden();

		return call_user_func_array(array($this, '_'.$method),
			$args);
	}

	private function _Test1()
	{
		print '× aufgerufen!'."\n";
	}

	private function _Test2()
	{
		print '× aufgerufen!'."\n";
	}
}

$cls = new Klasse();
$cls->Test1();
$cls->Test2();

/*
Ausgabe:
1× aufgerufen!
2× aufgerufen!
*/

?>

Ist zwar keine recht schöne Lösung, aber sie funktioniert zumindest :)
 
Zurück