W3docs

new

Das Schlüsselwort "new" erstellt in PHP neue Objekte aus Klassen. Syntax, Verwendung und moderne Varianten werden hier ausführlich erklärt.

Das PHP-Schlüsselwort new

Eine Klasse ist ein Bauplan; ein Objekt (oder eine Instanz) ist ein konkretes Ding, das aus diesem Bauplan erstellt wurde. Das Schlüsselwort new ist es, was diesen Aufbau vornimmt — es reserviert ein neues Objekt, führt den Konstruktor der Klasse aus und gibt eine Referenz auf das Ergebnis zurück. Fast immer, wenn man in PHP mit Objekten arbeitet, ist new der Ausgangspunkt.

Diese Seite behandelt die Syntax von new, was beim Aufruf passiert, wie Konstruktorargumente funktionieren und welche modernen Varianten man im echten Code antrifft (dynamische Klassennamen, new self/new static, anonyme Klassen und die ab PHP 8.4 hinzugefügte Form ohne Klammern).

Syntax

$object = new ClassName(arguments);
  • new löst die Instanziierung aus.
  • ClassName ist die zu instanziierende Klasse.
  • arguments werden an die __construct()-Methode der Klasse übergeben. Hat die Klasse keinen Konstruktor oder nimmt ihr Konstruktor keine Parameter entgegen, können leere Klammern verwendet werden: new ClassName().

Das Ergebnis ist ein Objekt-Handle, das $object zugewiesen wird. Ein erneuter Aufruf von new auf derselben Klasse erzeugt ein separates, unabhängiges Objekt.

Ein erstes Beispiel

<?php

class Greeter
{
  public function sayHello(): void
  {
    echo "Hello!";
  }
}

$object = new Greeter();
$object->sayHello();
// Output: Hello!

Sobald das Objekt existiert, wird der Operator -> verwendet, um seine Methoden aufzurufen und seine Eigenschaften zu lesen.

Konstruktorargumente übergeben

Definiert die Klasse eine __construct()-Methode, werden die Argumente in den Klammern nach new an diese weitergeleitet. So erhält jedes Objekt seinen eigenen Anfangszustand:

<?php

class User
{
  public function __construct(public string $name) {}
}

$alice = new User("Alice");
$bob   = new User("Bob");

echo $alice->name; // Alice
echo "\n";
echo $bob->name;   // Bob

$alice und $bob sind zwei verschiedene Objekte derselben Klasse, jedes mit seinem eigenen $name. Mehr dazu unter PHP Constructor.

„Probier es selbst" ist für dieses Beispiel nicht verfügbar.

Ein Objekt aus einem variablen Klassennamen erstellen

Die zu instanziierende Klasse muss nicht fest kodiert sein — sie kann aus einer Variable stammen. Dies ist die Grundlage von Factories, Plugin-Systemen und Dependency-Containern:

<?php

class PdfReport {}
class CsvReport {}

$type = "Csv";
$className = $type . "Report"; // "CsvReport"

$report = new $className();
echo get_class($report);
// Output: CsvReport

new self, new static und new parent

Innerhalb einer Klasse muss man häufig eine weitere Instanz derselben Klasse erstellen. Zwei Schlüsselwörter ermöglichen dies, und der Unterschied ist wichtig, wenn Vererbung im Spiel ist:

  • new self — instanziiert immer die Klasse, in der die Zeile geschrieben steht.
  • new static — instanziiert zur Laufzeit die tatsächliche Klasse (spätes statisches Binding), sodass Unterklassen ihren eigenen Typ erhalten.
<?php

class Animal
{
  public static function create(): static
  {
    return new static();
  }
}

class Dog extends Animal {}

echo get_class(Animal::create()); // Animal
echo "\n";
echo get_class(Dog::create());    // Dog (thanks to `new static`)

Hätte create() new self() verwendet, würden beide Aufrufe Animal zurückgeben. Mehr zu spätem statischen Binding unter Static Keyword.

Anonyme Klassen

Wenn man ein einmaliges Objekt benötigt und keine Klasse benennen möchte, erstellt und instanziiert new class in einem einzigen Ausdruck eine anonyme Klasse:

<?php

$logger = new class {
  public function log(string $message): void
  {
    echo "LOG: $message";
  }
};

$logger->log("started");
// Output: LOG: started

Anonyme Klassen können Konstruktorargumente entgegennehmen, Interfaces implementieren und andere Klassen erweitern — nützlich für schnelle Mocks und leichtgewichtige Callbacks.

Eine Methode direkt auf new aufrufen (PHP 8.4+)

Bisher musste ein new-Ausdruck in Klammern eingeschlossen werden, um eine Methode auf dem neuen Objekt aufzurufen. Ab PHP 8.4 sind die Klammern optional:

// PHP 8.4 and later:
$name = new User("Alice")->name;

// Before PHP 8.4 you had to write:
$name = (new User("Alice"))->name;

Die geklammerte Form sollte verwendet werden, wenn PHP 8.3 oder älter unterstützt werden muss.

Häufige Fallstricke

  • new gibt ein Objekt zurück, niemals eine Kopie. Das Zuweisen des Objekts an eine andere Variable kopiert den Handle, nicht das Objekt. Um ein unabhängiges Duplikat zu erhalten, verwendet man clone.
  • Fehlende Argumente lösen einen Fehler aus. Deklariert der Konstruktor erforderliche Parameter und werden diese weggelassen, wirft PHP einen ArgumentCountError.
  • Vergessen von Klammern bei einer einfachen Instanziierung. new MyClass (ohne Klammern) ist nur gültig, wenn keine Konstruktorargumente erforderlich sind; außerhalb des Method-Chaining-Falls aus 8.4 ist new MyClass() zur Klarheit vorzuziehen.

Verwandte Themen

Übungen

Übung
Was ist die Syntax, um ein neues Objekt in PHP zu initialisieren?
Was ist die Syntax, um ein neues Objekt in PHP zu initialisieren?
Was this page helpful?