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 {});