Skip to main content

Hallo! Gerne, ich helfe dir dabei, den Unterschied zu verstehen.

Du hast da ein paar Dinge angesprochen, die wir am besten sortieren. Im Kern geht es um den Unterschied zwischen statischen und nicht-statischen (oder Instanz-) Membern (Eigenschaften und Methoden) in einer Klasse.

 

Der Pfeil-Operator: -> (Objekt-Operator)

 

Dieser Operator wird verwendet, wenn du auf Methoden oder Eigenschaften eines konkreten Objekts (einer Instanz) zugreifen möchtest. Du musst also zuerst mit new ein Objekt dieser Klasse erstellen.

  • Wann sinnvoll? Immer dann, wenn die Methode oder Eigenschaft Daten verarbeitet, die zu diesem einen, spezifischen Objekt gehören. Stell dir eine Klasse User vor. Jeder User hat einen eigenen Namen, eine eigene E-Mail-Adresse usw.

Beispiel:

PHP

class User {
    public string $name; // Jedes User-Objekt hat seinen eigenen Namen

    public function __construct(string $name) {
        $this->name = $name;
    }

    public function introduce() {
        echo "Hallo, ich bin " . $this->name;
    }
}

$user1 = new User("Peter"); // Ein konkretes Objekt
$user1->introduce(); // Ausgabe: Hallo, ich bin Peter

$user2 = new User("Maria"); // Ein anderes konkretes Objekt
$user2->introduce(); // Ausgabe: Hallo, ich bin Maria

Hier siehst du: introduce() gibt für jedes Objekt etwas anderes aus, weil es auf die spezifische Eigenschaft $name des jeweiligen Objekts zugreift.


 

Der Doppelpunkt-Operator: :: (Scope Resolution Operator)

 

Dieser Operator, auch „Paamayim Nekudotayim“ genannt, wird für den Zugriff auf statische Member verwendet. Statische Methoden und Eigenschaften gehören zur Klasse selbst, nicht zu einem einzelnen Objekt. Du brauchst also kein Objekt zu erstellen, um sie aufzurufen.

  • Wann sinnvoll? Wenn eine Methode eine allgemeine Funktion erfüllt, die nicht vom Zustand eines bestimmten Objekts abhängt. Deine Validation::check()-Methode ist ein perfektes Beispiel. Sie prüft vermutlich irgendwelche Daten, aber sie benötigt dafür keine Informationen, die in einem Validation-Objekt gespeichert sind. Man nennt solche Methoden auch oft „Helfer-“ oder „Utility-„Methoden.

Beispiel:

PHP

class Validation {
    public static function checkEmail(string $email) {
        if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
            return true;
        }
        return false;
    }
}

// Kein Objekt nötig!
if (Validation::checkEmail("test@example.com")) {
    echo "Die E-Mail ist gültig.";
}

 

Korrektur deiner Annahmen

 

  1. $val = new Validation; $val->check(): Das funktioniert in PHP zwar, wenn die Methode check public static ist, aber es ist schlechter Stil. Man mischt hier die Konzepte. Wenn eine Methode statisch ist, sollte man sie auch statisch aufrufen (Validation::check()), um klarzumachen, dass sie nicht vom Objekt $val abhängt.
  2. Validation::username: Das funktioniert nur, wenn die Eigenschaft userName als static deklariert wurde.
    • Wenn es eine nicht-statische Eigenschaft ist (Standardfall), wie public string $userName;, dann gehört sie zu einem Objekt und du musst sie mit -> ansprechen:
      PHP

      $val = new Validation();
      $val->userName = "Max"; // Zugriff über ->
      
    • Wenn sie statisch ist, wie public static string $userName;, dann gehört sie zur Klasse und du greifst mit :: darauf zu (wobei das Dollarzeichen $ dann beim Namen steht):
      PHP

      Validation::$userName = "Globaler Name"; // Zugriff über ::
      

 

Zusammenfassung

 

Operator Name Verwendung für… Braucht new? Beispiel
-> Objekt-Operator Nicht-statische Eigenschaften und Methoden eines Objekts. Ja $user->name
:: Scope Resolution Operator Statische Eigenschaften und Methoden der Klasse. Nein Validation::check()

Faustregel:

  • Hat es mit einem einzelnen, konkreten Ding zu tun (ein bestimmter User, ein bestimmtes Produkt)? -> Objekt erstellen und -> verwenden.
  • Ist es eine allgemeine Hilfsfunktion, die für sich allein steht (etwas validieren, etwas formatieren)? -> Statisch machen und mit :: aufrufen.

Leave a Reply