Properties: Neue Get-/Set-Syntax für PHP?

Tags:

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:

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

Kommentare