OOP Best Practice: andere Classes immer per __construct re-instanziieren?

joobie

Mitglied
Hi zusammen,

Dies ist eine Frage die mich schon immer geplagt hat: wie sollte man eine Fremd-Methode in einer Class instanziieren? Also:

Class A:
PHP:
class a {
     public function a_function() {
          ...
     }
}

Class B, so wie ich es bisher gemacht habe:
PHP:
class b {
     private $a;
     function __construct() {
          require_once 'a.class.php':
          $this->a = new a();
     }

     function b() {
          $result = $this->a->a_function();
     }
}

Ist dies die beste Methode? Wenn ich die __construct()-Funktion aus der class b herausnehme und statt dessen $a public mache, geht es nicht, da $a gar nicht erst in die Klasse eingeführt wird. Und $a jedes Mal als Parameter an die Klassen-Funktionen zu übermitteln ist ein wenig umständlich.

Wie macht Ihr das normalerweise?
 
Ich weiß nicht, was du mit diesem Konstrukt genau bezwecken willst, aber wenn du lediglich eine Instanz von Klasse a in Klasse b benötigst, könnte man a als Singleton implemementieren:

PHP:
class a
{
  private static $_instance = null;

  private function __construct()
  {
    // Hier Initialisierung von bspw. Member-Variablen in a
  }

  public static function getInstance()
  {
    if(self::$instance == null)
    {
      self::$instance = new a();
    }
    return self::$instance;
  }

  public function a_function()
  {
    echo "I am a function";
  }
}

class b
{
  public function b_function()
  {
    a::getInstance()->a_function();
  }
}

$b = new b();
$b->b_function();
 
Danke für die Antwort saftmeister. Ich bin bisher nicht dazu gekommen zu antworten, wollte mich aber bedanken.

Dein Beispiel sieht für mich im Grunde genauso aus wie meins, es ist nur anders strukturiert: die Klasse a wird in beiden Fällen re-instanziiert, nur dass das bei Deiner Methode in der gleichen Klasse passiert, und in der anderen einfach abgerufen wird. Ich wollte einen Ressourcen-schonenden Weg finden - aber nach reiflicher Überlegung glaube ich, dass die erste Klasse so oder so re-instanziiert werden muss. In welcher der zwei Klassen das passiert, ist (glaube ich) egal, jedoch korrigiere mich bitte, falls ich falsch liege.

Dein Beispiel hat mir jedoch trotzdem sehr geholfen: Ich weiß nun von Singletons und weiß auch endlich, was es mit der :: Schreibweise auf sich hat :)

Vielen Dank nochmal.
 
Du liegst hier falsch joobie, es wird nur eine einzige Instanz aus der Klasse a erstellt, diese wird in der statischen Klassen-Variable $_instance gespeichert, somit steht die Instanz(Objekt) der Klasse a immer zur verfügung und erzeugt keine weiteren Instanzen falls es schon eine gibt.
Bei jedem Aufruf wird nur die Referenz auf das Objekt weitergegeben.
Das ist sehr Resource-schonend und schneller als das jedesmal aus einer Klasse ein Objekt erzeugt wird wie in deinen Beispiel.
So ein mit dem Singleton Entwurfsmuster erzeugtes Objekt
PHP:
a::getInstance()->a_function();
steht überall zur Verfügung, in allen Funktionen und Methoden aller Klassen und muss nicht wie in deinen Beispiel mit
PHP:
function __construct() {
    $this->a = new a();
}
erst erzeugt werden.
 
Zurück