Unterstützung für anonyme Klassen wurde in PHP 7 hinzugefügt. Anonyme Klassen sind nützlich, wenn einfache Objekte zum einmaligen Gebrauch erzeugt werden müssen.
<?php
// Code vor PHP 7
class Logger
{
public function log($msg)
{
echo $msg;
}
}
$util->setLogger(new Logger());
// PHP 7+ Code
$util->setLogger(new class {
public function log($msg)
{
echo $msg;
}
});
Sie können Argumente über ihren Konstruktor empfangen, andere Klassen erweitern, Interfaces implementieren und Traits verwenden, so wie das eine normale Klasse auch kann:
<?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 jener 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 oder geschützte 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