Анонимные классы полезны, когда необходимо создать простые одноразовые объекты.

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

Приведенный выше пример выведет:

объект(класс@анонимный)#1 (1) {
  ["Код командной строки 0x104c5b612":"class@anonymous":private]=>
  интервал(10)
}

Вложение анонимного класса в другой класс не дает ему доступа ни к каким закрытым или защищенным методам или свойствам этого внешнего класса. Чтобы использовать защищенные свойства или методы внешнего класса, анонимный класс может расширить внешний класс. Чтобы использовать приватные свойства внешнего класса в анонимном классе, их нужно передать через его конструктор:

<?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();

Приведенный выше пример выведет: 6

Все объекты, созданные одним и тем же объявлением анонимного класса, являются экземплярами этого самого класса.

<?php
function anonymous_class()
{
    return new class {};
}

if (get_class(anonymous_class()) === get_class(anonymous_class())) {
    echo 'same class';
} else {
    echo 'different class';
}

Приведенный выше пример выведет:

same class