Anonyme Klassen
Anonyme Klassen sind nützlich, wenn einfache Objekte zum einmaligen Gebrauch erzeugt werden müssen.
<?php
// Verwendung einer expliziten Klasse
class Logger
{
public function log($msg)
{
echo $msg;
}
}
$util->setLogger(new Logger());
// Verwendung einer anonymen Klasse
$util->setLogger(new class {
public function log($msg)
{
echo $msg;
}
});
Anonyme Klassen können Argumente über ihren Konstruktor empfangen, andere Klassen erweitern, Interfaces implementieren und Traits genau wie eine normale Klasse verwenden:
<?php
class SomeClass {}
interface SomeInterface {}
trait SomeTrait {}
var_dump(new class(10) extends SomeClass implements SomeInterface {
private $num;
public function __construct($num)
{
$this->num = $num;
}
use SomeTrait;
});
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
object(class@anonymous)#1 (1) { ["Command line code0x104c5b612":"class@anonymous":private]=> int(10) }
Das Verschachteln einer anonymen Klasse innerhalb einer anderen Klasse gibt ihr keinen Zugriff auf private oder geschützte Methoden oder Eigenschaften der äußeren Klasse. Um die geschützten Methoden oder Eigenschaften der äußeren Klasse zu verwenden, kann die anonyme Klasse die äußere Klasse erweitern. Um private Eigenschaften der äußeren Klasse in der anonymen Klasse zu verwenden, müssen sie dem Konstruktor übergeben werden:
<?php
class Outer
{
private $prop = 1;
protected $prop2 = 2;
protected function func1()
{
return 3;
}
public function func2()
{
return new class($this->prop) extends Outer {
private $prop3;
public function __construct($prop)
{
$this->prop3 = $prop;
}
public function func3()
{
return $this->prop2 + $this->prop3 + $this->func1();
}
};
}
}
echo (new Outer)->func2()->func3();
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
6
Alle Objekte, die durch dieselbe anonyme Klassendeklaration erzeugt werden, sind Instanzen von genau dieser Klasse.
<?php
function anonymous_class()
{
return new class {};
}
if (get_class(anonymous_class()) === get_class(anonymous_class())) {
echo 'dieselbe Klasse';
} else {
echo 'eine andere Klasse';
}
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
dieselbe Klasse
Hinweis:
Es ist zu beachten, dass anonymen Klassen von der Engine ein Name zugewiesen wird, wie im folgenden Beispiel gezeigt. Dieser Name muss als Implementierungsdetail eingestuft werden, auf dass sich nicht verlassen werden sollte.
<?php
echo get_class(new class {});Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:
class@anonymous/in/oNi1A0x7f8636ad2021