Properties: Neue Get-/Set-Syntax für PHP?
Update 09.01.2012: Der Link zum aktuellen RFC (21.12.2011) ist https://wiki.php.net/rfc/propertygetsetsyntax-as-implemented
In PHP nennen wir Instanzvariablen meist Eigenschaften, oder eben Properties, einer Klasse. In der Folge nennen wir die nun Attribute, denn sonst versteht niemand mehr was dieses RFC vorschlägt: Eine neue Syntax um Getter und Setter in PHP zu schreiben.
Worum geht's?
Schaut euch diesen Code mal an. Achtung: Die $value Variable ist automatisch im Gültigkeitsbereich von set verfügbar.
class Person
{
const KG_TO_LB = 0.45359237;
private $weight;
public property weightInKilograms
{
public get { return $this->weight; }
public set { $this->weight = $value; }
}
public property weightInPounds
{
public get { return $this->weight / self::KG_TO_LB; }
public set { $this->weight = $value * self::KG_TO_LB; }
}
}
$philippe = new Person();
$philippe->weightInKilograms = 84;
echo $philippe->weightInPounds; // 185.188...
Properties sollen also PHP so erweitern, dass schnell und einfach Getter und Setter für Klassen-Attribute geschrieben werden können. Und zwar mit einem Language-Feature und nicht als Eigenimplementation in Userland.
Obiges Beispiel ist momentan nur mit dem "Überladen" mittels __get() und __set() möglich. Dieser Ansatz hat mehrere Probleme:
__get()und__set()werden für alle undefinierten Attribute aufgerufen. Es muss also immer darauf geachtet werden welches Attribute übergeben wurde.__get()und__set()sorgen oft dafür, dass der Code nicht sauber strukturiert wird.- Es ist Magie. Und Magie ist nicht nur böse, sondern lässt sich auch nicht geschickt in eine IDE integrieren. Also sowas wie Autocompletion wird komplizierter.
- Und am wichtigsten:
__get()und__set()+ Vererbung sind eine Qual.
Noch mehr Spass
Wie ihr am public vor dem property und den gets und sets erahnen könnt, sollen die Properties auch die bekannten Sichtbarkeiten implementieren. Also public, protected und private. Properties sollen sich damit reibungslos in Klassenhierarchien einbauen lassen. Hier ein paar Beispiele:
class Number
{
protected $n;
public function __construct($n)
{
$this->number = $n;
}
public property number
{
set { $this->n = (int)$value; }
get { return $this->n; }
}
public property double
{
get { return $this->n * 2; }
}
}
class HalfNumber extends Number
{
public property number
{
set { $this->n = $value / 2; }
}
public property double
{
set { return $this->number / 2; }
}
}
$n = new Number(42);
echo $n->double; // 84
$n->double = 20; // Fehler: Kein Setter vorhanden
$n = new HalfNumber(42);
echo $n->number; // 21
$n->double = 20;
echo $n->number; // 5
Evtl. soll es auch ein readonly-Schlüsselwort für Properties geben. Damit liese sich unterbinden, dass Unterklassen set-Properties implementieren können. Also in obigem Beispiel könnte Number beim double-Property das readonly-Schlüsselwort verwenden und HalfNumber könnte dann nicht das set-Property implementieren.
Ein Vorschlag sieht auch vor, dass Properties ähnlich wie Traits ausserhalb von Klassen definiert und dann in eben solche eingespiesen werden können. Das wäre für Wiederverwendbarkeit ziemlich kuhl.
So, was haltet ihr davon? Sinnvolle Ergänzung? Zucker den niemand braucht?
Ähnliche Artikel
- PHP zvals und Referenzen erklärt
- Buzzworderia: Sigil
- Statische Methoden sind einfach nur Funktionen - also Vorsicht!




