Anonymous classes
Оновлено: 11.05.2023
Анонімні класи корисні, коли потрібно створювати прості, одноразові об'єкти.
<?php
// Using an explicit class
class Logger
{
public function log($msg)
{
echo $msg;
}
}
$util->setLogger(new Logger());
// Using an anonymous class
$util->setLogger(new class {
public function log($msg)
{
echo $msg;
}
});
Вони можуть передавати аргументи своїм конструкторам, розширювати інші класи, реалізовувати інтерфейси та використовувати риси так само, як і звичайні класи:
<?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;
});
Вкладення анонімного класу в інший клас не дає йому доступу до будь-яких закритих або захищених методів чи властивостей цього зовнішнього класу. Щоб використовувати захищені властивості або методи зовнішнього класу, анонімний клас може розширити зовнішній клас. Щоб використовувати закриті властивості зовнішнього класу в анонімному класі, їх потрібно передати через його конструктор:
<?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();
Усі об'єкти, створені одним анонімним оголошенням класу, є екземплярами цього самого класу.
<?php
function anonymous_class()
{
return new class {};
}
if (get_class(anonymous_class()) === get_class(anonymous_class())) {
echo 'same class';
} else {
echo 'different class';
}
Зауважте:
Зверніть увагу, що анонімним класам рушій присвоює ім'я, як показано у наступному прикладі. Це ім'я слід розглядати як деталь реалізації, на яку не слід покладатися.
<?php
echo get_class(new class {});