Klasse erweitern ohne den Namen zu ändern

ZodiacXP

Erfahrenes Mitglied
Hallo.

Ist es (abgesehen von aspects) Möglich eine Klasse zu erweitern ohne dessen Namen zu ändern?

Quasi etwas wie das Decorator-Pattern allerdings in umgekehrter weise.

Beispiel:
PHP:
class Main {}
class Main_Erweiterung {
  ...
  function foo() { echo "bar"; }
}

$x = new Main();
$x->foo(); //kommt zB aus Main_Erweiterung

Helfen vielleicht Reflections in Zusammenarbeit mit Classkit (was aber nicht mehr unterstützt wird)?
 
Was hält dich denn davon ab, die Methode direkt in die Klasse zu schreiben. Was mir sonst spontan einfällt wäre vielleicht Vererbung:
PHP:
<?php
class Parentclass{
  public function foo(){
    echo "foo";
  }
  protected function bar(){
    echo "bar";
  }
}

class Main extends Parentclass{
  public function do_something(){
    $this->bar();
  }
}
$x = new Main();
$x->foo(); //foo
$x->do_something(); //bar
?>
 
Da hast dich aber gut verlesen. Der Ansatz (nach deinem Beispiel) soll folgender sein:
PHP:
class Parentclass{
  public function foo(){
    echo "foo";
  }
  protected function bar(){
    echo "bar";
  }
}

class Erweiterung {
  public function do_something(){
    $this->bar();
  }
}

// Unveränderbar ab hier
$x = new Parentclass();
$x->foo(); //foo
$x->do_something(); //bar

Zuzüglich passender Zeilen, so dass dieses Verhalten ermöglicht werden kann. Fast schon Vererbung in die umgekehrte Richtung.
 
Zuletzt bearbeitet:
Vielleicht hast du dich auch nur unklar ausgedrückt?

Möglich eine Klasse zu erweitern ohne dessen Namen zu ändern?

Angenommen du hast die Klasse "Main":
PHP:
class Main{
  public function test1(){
    echo "test1";
  }
}
Um diese Klasse zu erweitern, ohne ihren Namen zu ändern, hast du jetzt entweder die Möglichkeit, die Erweiterung direkt in die Klasse zu schreiben:
PHP:
class Main{
  public function test1(){
    echo "test1";
  }
  public function test2(){
    echo "test2";
  }
}
Oder, da ich denke dass obrige Methode nicht ganz das ist was du möchtest, deine Klasse von einer anderen Klasse ihre Methoden erben zu lassen.
PHP:
class Base{
  public function test2(){
    echo "test2";
  }
}
class Main extends Base{
  public function test1(){
    echo "test1";
  }
}
Die Klasse Main hat jetzt Zugriff auf alle Variablen und Methoden von der Klasse Base, die nicht als private deklariert worden sind:
PHP:
$main = new Main();
$main->test1();
$main->test2();
 
Mit PHP 5.3 ist auch folgendes möglich:

PHP:
<?php 

class Foo 
{ 
	public function bar() 
	{ 
		echo "This is Foo::bar()\n"; 
	}
	public function __call($method, $args) 
	{ 
		if (isset($this->$method) === true) 
		{ 
			$func = $this->$method; $func(); 
		} 
	} 
} 
$foo = new Foo();
$foo->bar();

$foo->baz = function () { echo "This is Foo::baz()\n"; };

$foo->baz();

?>

Beispiel ist schamlos geklaut von:
Stubbles - Extending Objects With New Methods At Runtime
 
Das ist es!

Stubbles - Extending Objects With New Methods At Runtime
und
das runkit kann ich gut dafür verwenden. Danke!

Ich hab's über ein Stack versucht, bei dem die Funktionen abgearbeitet werden, wenn man eine erweitert aber das war ziemlich Kostenintensiv.
 
Zuletzt bearbeitet:
Zurück