Kleines Manko in PHP: Es gibt keine automatischen Property-Getter, und deshalb musst Du für öffentliche Eigenschaften, die auf dem Interface erscheinen sollen, get- und set-Methoden definieren
Interfaces in PHP können nur Methoden spezifizieren. (...) Wenn man Zustandszugriffe über ein Interface in PHP definieren möchte, muss man das sowieso über Verhalten regeln, also lies_dies()/schreib_das().
Sag ich doch... Oder meinte ich zumindest. Interfaces können IMMER nur Methoden definieren, nicht nur in PHP. Manchmal sind die Methoden durch eine Property-Syntax überzuckert (wie in C#), aber Methoden sind es trotzdem. Ob ich nun in C# schreibe
interface IKunz
{
string Name { get; set; }
string Vorname; // FEHLER - GEHT NICHT!
}
oder in PHP
interface IKunz
{
public function getName();
public function setName(string $name); // 'string' ist PHP 7
public $Vorname; // FEHLER - GEHT NICHT!
}
ist technisch exakt das gleiche. C# versteckt es nur hinter einer anderen Syntax (die übrigens erst in .net 2 auf die Autoproperties ausgedehnt wurde)
Die entscheidende Information ist, dass das der einzige Weg ist und die Bekanntgabe eines Eigenschaftszugriffs - wie string Vorname;
nicht möglich ist. Und das ist keine PHP Eigenschaft, sondern liegt im Wesen von Interfaces. Wenn ich auf dem Interface deklarieren könnte, dass das Objekt eine Eigenschaft "Vorname" hat und diese Eigenschaft NICHT per Methodenaufruf gekapselt würde, dann hätte man beim Implementieren des Interface nicht mehr die Wahl, ob Vorname ein eigenes Property ist oder der Teil hinter dem Komma von "Merkel, Angela".
Ich gebe zu, das kam in meinem Beitrag von oben nicht klar herüber. Aber genau diese Eigenschaft von Interfaces macht die Abstraktion, die sie anbieten, erst sinnvoll.
Und wenn ich ein Objekt vor mir habe, das IKunz implementiert, dann ist es nicht korrekt, Geheimwissen anzuwenden und am Interface vorbei auf andere, zufällig bei dieser Implementierung vorhandene Klassenelemente zuzugreifen, egal ob Methode oder Property. PHP erlaubt mir das, während Java oder C# mir auf die Fingerchen klopfen würden. Im folgenden PHP Beispiel funktioniert liesName ganz prima und gibt "zu Diensten" aus, obwohl ich mit Type Hint angegeben habe, dass da ein IKunz vorliegt (PHP 5.6, ich habe kein 7er hier).
interface IKunz
{
public function getName();
}
class Kunz implements IKunz
{
public function getName() { return "Konrad von Hinzensberger"; }
public function greeting() { return "zu Diensten"; }
}
function liesName(IKunz $k)
{
// PROGRAMMING ERROR - DON'T DO THIS AT WORK !
echo "Ich lese: " . $k->getName() . ", " . $k->greeting() . "\n";
}
$ik = new Kunz();
liesName($ik);
Rolf