2014-02-09 13 views
15

haben Gibt es eine einfache Möglichkeit, ein Konzept der Teilklasse in PHP haben, wie wir in C# haben? Ich habe versucht, es mit anderen Namespaces möglich zu machen, aber es konnte nicht funktionieren.Teil Klasse in PHP, wie wir in C#

+1

Warum es wollen würden Sie enthalten? ... Das ist übrigens eine ehrliche Frage. –

+4

Könnten Sie nach [Eigenschaften] (http://lv1.php.net/traits) suchen? –

+0

Partielle Klassen werden häufiger verwendet, wenn Teile der Klasse automatisch generiert werden (z. B. von einem Formulardesigner oder einem ORM-System), aber was ist Ihr Anwendungsfall hier? –

Antwort

16

Sie existieren nicht.

Wenn jedoch versucht man, einen Code-Generator für die Benutzer-Land-Code (wie in C# folgenden gleichen Anwendungsfall) zu implementieren angebracht werden könnte dann die folgenden ein gangbarer Weg sein kann:

class Generator 
{ 
    public function generate(Definition $definition) 
    { 
     if ($this->shouldGenerateTraitFor($definition)) { 
      $this->generateTraitFor($definition); 
     } 
     $this->generateClassFor($definition); 
    } 
} 

einige Implementierung wie die oben gegeben, könnte man dann:

(new Generator())->generate(new Definition([ 
    'class' => 'GeneratedClass', 
    'trait' => 'GeneratedTrait', 
])); 

Und der resultierende Code ähneln:

class GeneratedClass 
{ 
    use GeneratedTrait; 
} 

trait GeneratedTrait 
{ 
    // @todo; add "partial" code 
} 

Was wichtig zu beachten, über Generator::shouldGenerateTraitFor ist, dass, wenn es false zurückkehrt, wird das Merkmal nicht regeneriert werden. Dies kann davon abhängig sein, ob GeneratedTrait.php existiert, und ist notwendig, um sicherzustellen, dass der handgeschriebene Merkmalscode bei der Neugenerierung der Klasse nicht verfälscht wird.

jedoch, könnte es viel zu Ihrem Vorteil object composition über diesen Ansatz zu berücksichtigen.

Es gibt Zeiten, in denen ich das Gefühl, dass der generierte Code Ansatz sauberer sein können, wie zum Beispiel mit „Einheit“ Typen, aber das ist von Fall zu Fall.