Ich habe eine Klasse namens Assembly
, die die Implementierung der zugrunde liegenden Produkte versteckt. kann einen Satz von Gettern haben, ProductB
kann einen anderen haben.Wie kann PHP-Code auf bestimmte Klassen-Subtypen aufmerksam gemacht werden, wenn er Polymorphie verwendet?
Während PHP recht nachsichtig ist, und wenn ich nicht gleichzeitig auf Produkte und Getter, wird mein Code arbeiten, aber es gibt keinen Schutz bot, wenn ich mess up tun und füllen Assembly
mit ProductA
, aber dann einen Getter verwenden aus ProductB
.
Auch meine IDE kennt die Methoden aus beiden Klassen, also gibt es keine automatische Vervollständigung, wenn ich innerhalb Assembly
mit Getters von Product
arbeite.
ich mehr kugelsicheren Code wollen, ein, wo Assembly
weiß oder von die Product
Subtyp bewusst ist es zur Zeit beherbergt. Gibt es einen Weg dazu?
Probe unter
class Assembly
{
private $product;
public function setProduct(Product $product) {
$this->product = $product;
}
public function getA() {
return $this->product->getA();
}
public function getB() {
return $this->product->getB();
}
}
class Product { }
class ProductA extends Product
{
public function getA() {
return "A";
}
}
class ProductB extends Product
{
public function getB() {
return "B";
}
}
//set assembly
$assembly = new Assembly();
//define product sub-type
$product = new ProductB();
//place product into assembly
$assembly->setProduct($product);
//assembly has no clue which subtype it has
print $assembly->getB(); // "B"
print $assembly->getA(); // prints nothing
Schnittstelle Anregung
interface CompositeProductInterface
{
public function getA();
public function getB();
}
//update code in Assembly to:
public function setProduct(CompositeProductInterface $product)
{
$this->product = $product;
}
Das gibt mir die automatische Vervollständigung in meinem IDE, das ist schön, aber nicht meine andere Probleme zu lösen. Außerdem bin ich ein wenig unheimlich, wenn ich Dinge zu einem einzigen "zusammengesetzten" Produkt zusammenbilde ... Es scheint eher wie ein Workaround zu sein. In meinem speziellen Fall habe ich zwei sehr ähnliche Produkte, die sich in einigen winzigen Dingen wie einigen Eigenschaften unterscheiden.
Real World Beispiel
Beide Produkt Modelle A und B haben eine technische Zeichnung, die Variablen listet verschiedene Produktdimensionen zu identifizieren. Benannte Dimensionen sind in beiden Produkten ähnlich. Zum Beispiel bedeutet M1 auf Produkt A die gleiche physische Dimension auf Produkt B. Produkt A hat jedoch Merkmale, die auf Produkt B nicht vorhanden sind und umgekehrt.
Wenn das immer noch zu hypothetisch fühlt, sind die tatsächlichen Abmessungen auf der tatsächlichen Zeichnung aufgeführt als B2 und B3. Diese Dimensionen (B2, B3) sind auf dem anderen Produktmodell nicht vorhanden. Ich möchte in der Lage sein, ein Assembly-Konstrukt zu verwenden, um Variablen in der Zeichnung aufzulisten, einschließlich M1, B2, B3 und so weiter. Ich konnte dies mit
print $assembly->getM1(); //works for both products
print $assembly->getB2(); //works for one product only
print $assembly->getB3(); //same as above
Tor
Tor eine einzige Klasse zu haben ist (Montage) verantwortlich für benannte Bemaßungsvariablen Auflistung, und jedes Produkt kennen sich nur. So
- Versammlung sagt: "Ich weiß alles über die genannten Variablen I aufgelistet werden sollen (M1, B2, B3), unabhängig von Produktmodell"
- Produkt A sagt: „Ich weiß nur, was ich enthalten. I enthalten Benanntes Maß A. Ich weiß nicht, was B ist und interessiere mich auch nicht für
- Produkt B sagt "ich kenne nur B" ...
kühlen. Sie können auch 'ProductA :: class' Konstrukt anstelle von' "ProductA" 'mit Vorteil von Typ Hinting von IDE/PHP-Interpreter – Dennis
ist eine bessere Lösung für die Komparation. –