2016-07-10 15 views
3

Ich entwickle eine Anwendung in PHP, in dem die (jQuery-like) Stil der Verkettungsmethoden extrem praktisch ist. Ich spreche nicht von Vererbungsketten, sondern von einer Taxonomie von Instanzen von Klassen, die ineinander "eingebettet" sind. Jetzt frage ich mich, wie ich von einer niedrigeren Ebene auf eine Instanz auf höherer Ebene verweisen kann.Wie Vorfahren beim Verketten Instanzen der Klassen

Das klingt alles sehr abstrakt, also lassen Sie mich ein Beispiel geben. Nehmen wir an, ich möchte ein Buch (proze) in PHP schreiben (nur aus Gründen der Argumentation). Es ist sehr praktisch, wenn ich dies wie

$myBestseller = new Book(); 

$myBestseller 
    ->setAuthor("Jean-Saul Partre") 
    ->addChapter() 
    ->addParagraph("How the Rabit lost its wings.") 
     ->addWords("On a beautiful wintes day, the rabit flew over the … ") 
     ->addWords("Bla bla") 
     ->addWords("Bla bla"); 

Bis jetzt konnte ich es funktioniert. (Soll ich die tatsächlichen Klassendefinitionen einschließen?) Was nun, wenn ich auf eine Eigenschaft eines Objekts in der Hierarchie verweisen möchte? Lassen Sie uns sagen Ich mag würde den Namen des Autors in einem der Titel eines Kapitels gehören:

$myBestseller = new Book(); 

    $myBestseller 
     ->setAuthor("Jean-Saul Partre") 
     ->addChapter() 
     ->addParagrapWithAuthor("How "," fell out of the window."); 
      ->addWords("Bla bla") 
      ->addWords("Bla bla") 
      ->addWords("Bla bla") 

    var_dump($myBestseller); 

Lassen Sie uns nur die Kapitel Klassendefinition hinzufügen, auch hier:

class Chapter{ 
    private $_paragraphs = array(); 

    public function addParagraph($title){ 
    return $this->_pages[] = new Paragraph($title); 
    } 

    public function addParagrapWithAuthor($prefix, $suffix){ 
    $author = "Ideo Gram"; 
    return $this->_pages[] = new Paragraph($prefix.$author.$suffix); 
    } 
} 

Also, statt $ author = "Ideo Gram" Ich möchte die Definition des Autors des Buches verwenden. Der Titel mit diesem Code wäre

Wie Ideo Gram aus dem Fenster Statt

fiel, würde Ich mag es

sagen, wie Jean-Saul Patre aus dem fiel Fenster

Kann dies getan werden? Die einzige Lösung, die ich bisher gefunden habe, besteht darin, einen Hinweis auf Nachkommen unter dem Tisch zu geben, aber das scheint die Klassen zu verunreinigen.

Vielleicht ist die Antwort sehr geradlinig, aber ich kann es nicht finden. Ich kann die richtigen Bedingungen nicht kennen. :: parent, zum Beispiel, arbeitet mit erweiterten Klassen.

+0

Wenn Sie eine Richtungsunempfindlicher Verbindung zwischen Ihrem entites benötigen, dann in dem Autor des Buches einen Verweis halten (Sie scheinen bereits den Bezug auf den Autor aus dem Buch zu haben). Dies ist der einzige Weg, dies zu tun. Wenn Sie diese Beziehung nicht selbst definieren, sind diese Entitäten völlig unabhängig voneinander. – jobou

+1

Ich bin gespannt, ob in diesem Fall auch die Variadic-Funktion von Interesse ist. Lass mich wissen, was du denkst: https://en.wikipedia.org/wiki/Variadic_function – aguertin

+0

@aguertin Interessanter Gedanke, danke. Schlägst du vor, die "Abstammung" durch diese Variadiac-Funktion zu führen? Wie addCharacter ('æ', $ parent, $ grandparent, $ greatgrandparent, $ greatgreparent)? Ich bin überrascht zu lesen, dass es in PHP gemacht werden kann: http://php.net/manual/en/functions.arguments.php#functions.Variable-arg-Liste – Ideogram

Antwort

2

Es gibt keine Magie. Wenn Sie eine bidirektionale Beziehung zwischen zwei Entitäten benötigen, müssen sie sich gegenseitig referenzieren.

So Ihre Methode addChapter könnte dies tun:

public function addChapter() { 
    return $this->chapters[] = new Chapter($this); 
} 

So Ihr Kapitel wird:

class Chapter { 

    protected $book; 

    public function __construct(Book $book) { 
     $this->book = $book; 
    } 

    .... 

    public function addParagrapWithAuthor($prefix, $suffix){ 
     $author = $this->book->getAuthor()->getFullName(); 
     return $this->_pages[] = new Paragraph($prefix.$author.$suffix); 
    } 
} 
+0

Große Antwort, danke. Das meinte ich mit "unter dem Tisch gehen". In meiner Anwendung könnte dies bedeuten, dass der Verweis auf das "Wurzel" -Objekt 5 Ebenen tief ist. Aus Ihrer Antwort und Ihrem Beispiel verstehe ich, dass dies völlig akzeptabel ist. Und dass es keine magische Methode gibt, einen Nachkommen auf seine Herkunft aufmerksam zu machen :) – Ideogram

+0

Ich glaube nicht, dass es "unter dem Tisch" ist, wie du sagst. Sie können es so betrachten, als könnte ein Kapitel nicht leben, wenn es nicht im Besitz eines Buches ist. – jobou

+0

In der Tat kann es nicht :) – Ideogram