Le support pour les classes anonymes a été rajouté en PHP 7. Les classes anonymes sont utiles lorsque de simples objets uniques ont besoin d'être créés.
<?php
// Avant 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;
}
});
On peut leur passer des arguments via le constructeur, elles peuvent étendre d'autres classes, implémenter des interfaces ou utiliser des traits comme avec avec une classe normale.
<?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;
});
L'exemple ci-dessus va afficher :
object(class@anonymous)#1 (1) { ["Command line code0x104c5b612":"class@anonymous":private]=> int(10) }
Imbriquer une classe anonyme à l'intérieur d'une autre classe ne donne pas accès aux méthodes ou propriétés privées ou protégées de la classe contenante. Afin d'utiliser des méthodes ou propriétés protégées de la classe contenante, la classe anonyme doit étendre celle ci. Pour utiliser les propriétés privées ou protégées de la classe contenant dans la classe anonyme, celles ci doivent être passées via le constructeur.
<?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();
L'exemple ci-dessus va afficher :
6