2017-01-24 1 views
2

zu verlängern haben wir zwei Klassen Unter der Annahme, im \Base\Form\ Namespace:Mehrfachvererbung, ‚Notwendigkeit‘ zwei Klassen

class Field { 
    protected $name; 
    protected $value; 
} 

class DropdownField extends Field { 
    protected $options = []; 
    // with functions like setOptions(), addOption(), removeOption() etc. 
} 

nun in einem anderen Namespace, eine Klasse besteht, dass auf Field erstreckt, die ein zusätzliches 'layout_position' hat Immobilie:

namespace Integrations; 
class IntegrationsField extends \Base\Form\Field { 
    const LAYOUT_POSITION_LEFT = 'left'; 
    const LAYOUT_POSITION_RIGHT = 'right'; 
    protected $layoutPosition = self::LAYOUT_POSITION_LEFT; 
} 

Nun könnte man dieses kommen sehen, aber im Falle eines IntegrationsField, der auch ein Drop-Down sein kann:

namespace Integrations; 
class IntegrationsDropdownField extends \Base\Form\DropdownField {} 

Natürlich sollte dieser auch die $layoutPosition haben, die von IntegrationsField geerbt werden sollte, aber da wir zwei Klassen nicht erweitern können, was ist die beste Lösung, um hier zu gehen?

Antwort

5

PHP unterstützt keine Mehrfachvererbung. Sie können jedoch Ihre Logik mit Merkmalen umschreiben, um sie (sozusagen) zu simulieren.

class Field { 
    protected $name; 
    protected $value; 
} 

trait Dropdown { 
    protected $options = []; 
    // with functions like setOptions(), addOption(), removeOption() etc. 
} 

interface IntegrationPositions { 
    const LAYOUT_POSITION_LEFT = 'left'; 
    const LAYOUT_POSITION_RIGHT = 'right'; 
} 

trait Integration { 
    protected $layoutPosition = IntegrationPositions::LAYOUT_POSITION_LEFT; 
} 

class DropdownField extends Field { 
    use Dropdown; 
} 

class IntegrationField extends Field { 
    use Integration; 
} 

class DropdownIntegrationField extends Field { 
    use Integration,Dropdown; 
} 

Update: Als @Adambean bemerkte Merkmale können keine Konstanten haben. Ich habe daher das Beispiel mit einer Enumeration aktualisiert.

Das fühlt sich komisch an, ein Enum deklarieren zu müssen, das intern zu einem Merkmal gehört, aber PHP scheint keinen anderen Mechanismus zu erlauben, so weit ich weiß, ich bin offen für alle anderen Ideen.

+0

Dieses genaue Beispiel würde nicht funktionieren, weil Merkmale keine Konstanten haben können. (Dies löst einen schwerwiegenden Fehler aus.) – Adambean

+0

@Adambean Ich habe das Beispiel mit einem "enum" einer Art aktualisiert. Es passt nicht gut zu mir, aber es scheint nicht, dass PHP uns hier eine große Auswahl bietet. – apokryfos

+1

Schnittstellen können Konstanten haben? Ich wünschte, ich wüsste das vor 9 Stunden. : D – Adambean