# 5.3.5 Methode set

Mit `__set()` kann einem Objekt Eigenschaften zugewiesen werden, die vorher nicht deklariert wurden. Wir wollen dem Objekt `$ute` aus unserem Beispiel nun bestandene Prüfungen und die zugehörigen Noten zuweisen. Statt alle möglichen Prüfungen als Eigenschaften zu deklarieren, was unpraktikabel ist, da Ute auch Lehrveranstaltungen aus anderen Fachbereichen belegen könnte, benötigen wir eine flexible Lösung, um Prüfungen und Noten hinzuzufügen.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?php
    class Student
    {
        private $name = "keine Angabe";
        private $matrNumber = 0;
        protected $exams = [];  // Eigenschaft $exams als assoz. Array

        public function __construct(string $name, int $matrNumber)
        {
            $this->matrNr = $matrNumber;
            $this->name = $name;
        }

        public function __set(string $subject, float $grade): void
        {
            $this->exams[$subject] = $grade;
        }
    }

    // Hauptprogramm
    $ute = new Student("Ute", 7209999);
    $ute->Internetprogrammierung = 1.3;

In Zeile 21 wird so getan, als gäbe es eine Eigenschaft `Internetprogrammierung` in der Klasse `Student` und dieser Eigenschaft wird der Wert `1.3` zugewiesen. Da es diese Eigenschaft aber nicht gibt, wird nachgeschaut, ob es eine `__set()`-Methode gibt, die stattdessen aufgerufen wird.

Anmerkung

Natürlich lassen sich die Prüfungen auch explizit über eine Methode setzen und auslesen, was normalerweise der bessere Programmierstil ist:

    public function setExamResult(string $subject, float $grade): void