Eigenschaften

Variablen in einer Klasse werden Eigenschaften genannt. Andere Begriffe wie Felder werden ebenfalls verwendet, um sich auf dasselbe Konzept zu beziehen, aber innerhalb dieser Referenz wird der Begriff Eigenschaften verwendet. Diese werden definiert, indem mindestens ein Modifikator (wie Sichtbarkeit, Schlüsselwort static oder, seit PHP 8.1.0, readonly) verwendet wird, seit PHP 7.4 optional (außer für readonly-Eigenschaften) gefolgt von einer Typdeklaration, gefolgt von einer regulären Variablendeklaration. Die Deklaration darf eine Initialisierung des Variablenwertes beinhalten, der zu setzende Wert muss dabei allerdings ein konstanter Wert sein.

Hinweis:

Eine veraltete Art, Klasseneigenschaften zu deklarieren, ist die Verwendung des Schlüsselwors var anstelle eines Modifikators.

Hinweis: Eine Eigenschaft, die ohne Modifikator für Sichtbarkeit deklariert wird, wird als public deklariert.

Innerhalb der Methoden einer Klasse kann auf nicht-statische Eigenschaften zugegriffen werden, indem man (den Objektoperator) -> verwendet: $this->property (wobei property der Name der Eigenschaft ist). Zugriff auf statische Eigenschaften erhält man, indem man (den Doppel-Doppelpunkt) :: verwendet: self::$property. Siehe auch Schlüsselwort static für mehr Informationen zu diesem Thema.

Die Pseudo-Variable $this ist innerhalb jeder Klassenmethode verfügbar, wenn diese Methode im Kontext eines Objektes aufgerufen wird. $this ist der Wert des aufrufenden Objekts.

Beispiel #1 Deklaration von Eigenschaften

<?php
class SimpleClass
{
   public 
$var1 'Hallo ' 'Welt';
   public 
$var2 = <<<EOD
Hallo Welt
EOD;
   public 
$var3 1+2;
   
// Ungültige Deklarationen von Eigenschaften:
   
public $var4 self::myStaticMethod();
   public 
$var5 $myVar;

   
// Gültige Deklarationen von Eigenschaften:
   
public $var6 myConstant;
   public 
$var7 = [truefalse];

   public 
$var8 = <<<'EOD'
Hallo Welt
EOD;

   
// Ohne Modifikator für Sichtbarkeit (Zugriffsrechte):
   
static $var9;
   
readonly int $var10;
}
?>

Hinweis:

Es gibt verschiedene Funktionen für den Umgang mit Klassen und Objekten. Siehe hierzu Klassen- und Objekt-Funktionen.

Deklaration von Typen

Von PHP 7.4.0 an können Eigenschaftsdefinitionen Type declarations enthalten, mit Ausnahme des Typs callable.

Beispiel #2 Beispiel von typisierten Eigenschaften

<?php

class User
{
    public 
int $id;
    public ?
string $name;

    public function 
__construct(int $id, ?string $name)
    {
        
$this->id $id;
        
$this->name $name;
    }
}

$user = new User(1234null);

var_dump($user->id);
var_dump($user->name);

?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

int(1234)
NULL

Typisierte Eigenschaften müssen vor dem Zugriff initialisiert werden, sonst wird ein Error ausgelöst.

Beispiel #3 Auf Eigenschaften zugreifen

<?php

class Shape
{
    public 
int $numberOfSides;
    public 
string $name;

    public function 
setNumberOfSides(int $numberOfSides): void
    
{
        
$this->numberOfSides $numberOfSides;
    }

    public function 
setName(string $name): void
    
{
        
$this->name $name;
    }

    public function 
getNumberOfSides(): int
    
{
        return 
$this->numberOfSides;
    }

    public function 
getName(): string
    
{
        return 
$this->name;
    }
}

$triangle = new Shape();
$triangle->setName("triangle");
$triangle->setNumberofSides(3);
var_dump($triangle->getName());
var_dump($triangle->getNumberOfSides());

$circle = new Shape();
$circle->setName("circle");
var_dump($circle->getName());
var_dump($circle->getNumberOfSides());
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

string(8) "triangle"
int(3)
string(6) "circle"

Fatal error: Uncaught Error: Typed property Shape::$numberOfSides must not be accessed before initialization

Readonly- (nur lesbare) Eigenschaften

Seit PHP 8.1.0 ist es möglich, eine Eigenschaft mit readonly zu deklarieren. Dadurch wird verhindert, dass die Eigenschaft nach der Initialisierung geändert wird.

Beispiel #4 Beispiel für Readonly-Eigenschaften

<?php

class Test {
   public 
readonly string $prop;

   public function 
__construct(string $prop) {
       
// Korrekte Initialisierung.
       
$this->prop $prop;
   }
}

$test = new Test("foobar");
// Korrekt ausgelesen.
var_dump($test->prop); // string(6) "foobar"

// Unzulässige Neuzuweisung. Es spielt keine Rolle, dass der
// zugewiesene Wert derselbe ist.
$test->prop "foobar";
// Error: Cannot modify readonly property Test::$prop
?>

Hinweis:

Der Modifikator readonly kann nur auf typisierte Eigenschaften angewendet werden. Wenn eine Eigenschaft ohne Typbeschränkung readonly sein soll, kann der Typ mixed verwendet werden.

Hinweis:

Statische Readonly-Eigenschaften werden nicht unterstützt.

Eine Readonly-Eigenschaft kann nur einmal initialisiert werden, und zwar nur aus dem Bereich, in dem sie deklariert wurde. Jede andere Zuweisung oder Änderung der Eigenschaft führt zu einer Error-Exception.

Beispiel #5 Unzulässige Initialisierung von Readonly-Eigenschaften

<?php
class Test1 {
    public 
readonly string $prop;
}

$test1 = new Test1;
// Unzulässige Initialisierung außerhalb des privaten Bereichs.
$test1->prop "foobar";
// Error: Cannot initialize readonly property Test1::$prop from global scope
?>

Hinweis:

Die Angabe eines festen Standardwerts für Readonly-Eigenschaften ist nicht zulässig, da eine Readonly-Eigenschaft mit einem Standardwert im Wesentlichen dasselbe ist wie eine Konstante und daher nicht besonders nützlich.

<?php

class Test {
    
// Fatal error: Readonly property Test::$prop cannot have default value
    
public readonly int $prop 42;
}
?>

Hinweis:

Readonly-Eigenschaften können nach der Initialisierung nicht mit unset() zurückgesetzt werden. Es ist jedoch möglich, eine Readonly-Eigenschaft vor der Initialisierung aus dem Bereich, in dem sie deklariert wurde, zurückzusetzen.

Änderungen sind nicht notwendigerweise einfache Zuweisungen; alle folgenden führen ebenfalls zu einer Error-Exception:

<?php

class Test {
    public function 
__construct(
        public 
readonly int $i 0,
        public 
readonly array $ary = [],
    ) {}
}

$test = new Test;
$test->+= 1;
$test->i++;
++
$test->i;
$test->ary[] = 1;
$test->ary[0][] = 1;
$ref =& $test->i;
$test->=& $ref;
byRef($test->i);
foreach (
$test as &$prop);
?>

Readonly-Eigenschaften schließen jedoch nicht die interne Veränderbarkeit aus. Objekte (oder Ressourcen), die in Readonly-Eigenschaften gespeichert sind, können intern immer noch verändert werden:

<?php

class Test {
    public function 
__construct(public readonly object $obj) {}
}

$test = new Test(new stdClass);
// Zulässige interne Änderung.
$test->obj->foo 1;
// Unzulässige Neuzuweisung.
$test->obj = new stdClass;
?>

Hier Kannst Du einen Kommentar verfassen


Bitte gib mindestens 10 Zeichen ein.
Wird geladen... Bitte warte.
* Pflichtangabe
Es sind noch keine Kommentare vorhanden.

Grundlagen von Views in MySQL

Views in einer MySQL-Datenbank bieten die Möglichkeit, eine virtuelle Tabelle basierend auf dem Ergebnis einer SQL-Abfrage zu erstellen. ...

admin

Autor : admin
Kategorie: mySQL-Tutorials

Definition von Stored Procedures - eine Einführung

Stored Procedures sind vordefinierte SQL-Codeblöcke, die in einer Datenbank gespeichert sind und bei Bedarf aufgerufen werden können. ...

Bernie

Autor : ebiz-consult GmbH & Co. KG
Kategorie: mySQL-Tutorials

Wie kann man komplexe Abfragen mit SQL-Querys In MySQLi effektiv durchführen?

In diesem MySQL-Tutorial wird erklärt, wie komplexe SQL-Abfragen in MySQLi effizient durchgeführt werden können. Wir werden uns mit verschiedenen Aspekten der Datenbankabfrage beschäftigen und spezifische Methoden kennenlernen. ...

TheMax

Autor : TheMax
Kategorie: mySQL-Tutorials

Tutorial veröffentlichen

Tutorial veröffentlichen

Teile Dein Wissen mit anderen Entwicklern weltweit

Du bist Profi in deinem Bereich und möchtest dein Wissen teilen, dann melde dich jetzt an und teile es mit unserer PHP-Community

mehr erfahren

Tutorial veröffentlichen

[Wichtig] Anmeldung im Forum

Guess the hidden word using logic and deduction in the engaging game of Wordle. Wordle nyt (https://wordlenytimes.net/) ​

Geschrieben von lenytimes am 19.04.2024 19:21:45
Forum: Fragen/Vorschläge zum Forum
Professioneller Webentwickler & Webdesigner

Of course, here is the translation: Hello, Thank you for your interest in the long-term project. Your extensive skills and experience in web dev ...

Geschrieben von Athelstan am 15.04.2024 09:25:39
Forum: Jobgesuche
Wir stellen unsere SEO-Agentur vor

Hallo In der heutigen digitalen Welt war es für Unternehmen noch nie so einfach, ihre Reichweite weltweit zu vergrößern. Wenn Sie außerhalb I ...

Geschrieben von thomasmuller am 14.04.2024 07:18:33
Forum: User stellen sich vor
Spielplan für 4 Gruppen zu je 6 Teams auf 2 Feldern

Hallöchen zusammen, ich versuche derzeit unseren Excel-Spielplan in PHP zu überführen. Eigentlich bin ich auch shon fertig - wenn da nicht dies ...

Geschrieben von derH0st am 11.04.2024 15:58:37
Forum: PHP Developer Forum