The fact that the anonymous class syntax defines a class *and* immediately constructs an instance is quite annoying.
For one, this is quite incompatible with DI containers' ability to resolve constructor arguments. Lets say you DI container can register a named component by merely referencing a class that uses constructor injection - so lets say this works: class MyController { public function __construct(MyService $service) { // ... } } $container->register("my-controller", MyController::class); Now I want to register an anonymous class, for example as part of an integration test-suite, which is common enough: $container->register("my-controller", new class { public function __construct(MyService $service) { // ... } }); This doesn't work, because you're expected to actually pass the constructor arguments immediately - because you can only define an anonymous class while immediately creating an instance. What I really want is just an anonymous class - not an instance, so: $container->register("my-controller", class { public function __construct(MyService $service) { // ... } }); The question is, what would a class expression without the new keyword evaluate to? Since we normally reference classes with just a class-name, I guess I'd expect a string, like you'd get from the ::class constant. Any hope for something like that?