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:
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 einemValidation
-Objekt gespeichert sind. Man nennt solche Methoden auch oft „Helfer-“ oder „Utility-„Methoden.
Beispiel:
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
$val = new Validation; $val->check()
: Das funktioniert in PHP zwar, wenn die Methodecheck
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.Validation::username
: Das funktioniert nur, wenn die EigenschaftuserName
alsstatic
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):PHPValidation::$userName = "Globaler Name"; // Zugriff über ::
- Wenn es eine nicht-statische Eigenschaft ist (Standardfall), wie
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.