2017-02-02 2 views
2

Ich habe eine Projektklasse/ein Objekt, die (eine eigene) unbestimmte Anzahl von Phase-Objekten haben müssen. Ich kenne nicht die Anzahl der Phasen, die das Projektobjekt beim Erstellen haben wird, also wollte ich die Phase-Objekt-Erstellung nicht in die Konstruktorfunktion von Project einfügen.PHP - unsichere Anzahl Objekte, die einem anderen Objekt gehören

Meine Klassen:

class Project { 
    //some properties 
} 

class Phase { 
    public $property; 
} 

Und ich möchte, dies zu tun:

$foo = $myProject->phase01->property; 
$bar = $myProject->phase06->property; 
//etc... 

Bitte helfen Sie, zu wissen, wie dies am besten zu erledigen.

+0

Sie könnten myProject aufgebläht sein, wenn die App größer wird. Sie müssen myProject nicht bei jedem Anruf anrufen. Lassen Sie eine Factory eine Instanz zurückgeben und speichern Sie diese in einem Array. – Nitin

Antwort

0

Sie könnten einer von php's magic methods, insbesondere __get

<?php 

class Project { 
    //some properties 
    public function __get($property) 
    { 
     // if begins with "phase" and some number 
     if (preg_match("/^phase\d+$/", $property) === 1) { 
      if (!isset($this->$property)) { 
       $this->$property = new Phase; 
      } 

      return $this->$property; 
     } 
    } 
} 

class Phase { 
    public $property; 
} 


$myProject = new Project; 

//And I'd like to do this: 

$foo = $myProject->phase01->property; 
$bar = $myProject->phase06->property; 
//etc... 
+0

Danke Jeff. Und was, wenn ich bei PHP 5 feststecke? Wie auch immer, gehe ich meinem Problem in Bezug auf Design den richtigen Weg? – Ben

+0

@Ben Ich habe es für PHP 5 herabgestuft. Was das Problem angeht, hast du es nicht wirklich klar spezifiziert. Vielleicht, wenn Sie besser erklären, warum Sie etwas tun wollten, wäre es einfacher, einen Ansatz zu geben. Wenn ich raten müsste, würde ich vermuten, dass Sie mit einer iterierbaren Sammlung besser umgehen würden, wie ein Array, das alle Phasen enthält. –

+0

Ich denke, Sie haben richtig verstanden, was ich versuchte zu bekommen - und Yivi lieferte ein Beispiel dafür, wie man das macht. Ich bin auch über die 'SplObjectStorage'-Klasse gestolpert und frage mich, ob das für diese Art von Problem funktioniert. – Ben

1

implementieren würde ich keine dynamischen Eigenschaften verwenden.

Wenn die Phasen eine Sammlung sind, würde sie als solche behandeln, könnte es später praktisch kommen. E.g.:

class Project { 

    private $phases = []; 

    public function __get($property) 
    { 
     // if begins with "phase" and some number 
     if (preg_match("/^phase(\d+)$/", $property, $matches)) { 
      // if is set already, we return it 
      if (isset($this->phases[$matches[1]])) { 
       return $this->phases[$matches[1]]; 
      } 
      // if it isn't, it isn't :) 
      return null;  
     } 
    } 

    public function __set($property, $value) 
    { 
     if (preg_match("/^phase(\d+)$/", $property, $matches)) { 
      $this->phases[$matches[1]] = $value; 
     } 
    } 

    public function addPhase(Phase $phase, $phase_number = null) 
    { 
     if ($phase_number !== null) { 
      $this->phases[$phase_number] = $phase; 
     } 
     else { 
      $this->phases[] = $phase; 
     } 

     return $this; 
    } 

    public function getPhases() 
    { 
     return $this->phases; 
    } 

    // etc 
} 

class Phase { 
    public $property = ""; 
    public function __construct($property) { 
    $this->property = $property; 
    } 
} 

$myProject = new Project(); 

$myProject->phase1 = new Phase('startup'); 

$myProject 
     ->addPhase(new Phase('build')) 
     ->addPhase(new Phase('cleanup')); 

foreach ($myProject->getPhases() as $key => $phase) { 
    echo "Phase $key: {$phase->property}", "\n"; 
} 
+0

Ich habe mit Ihrem Code gespielt, um sicherzustellen, dass ich es verstehe. Das ist die Neuausrichtung, von der ich glaube, dass ich sie brauchte. Ich bin auch über 'SplObjectStorage' gestolpert und frage mich, ob ich etwas so verwenden sollte, um meine Phase-Objekte im Projekt-Objekt zu speichern. – Ben

+0

Nicht sehr vertraut mit diesem. Aber ich würde die Dinge nicht unnötig komplizieren. Beginne mit etwas, das du verstehst, und baue von dort aus. – yivi

+0

Ich bemerkte ein paar Bugs/Tippfehler in meinem Code. aktualisiert und mit der repl-Version verknüpft – yivi

Verwandte Themen