new in initializers works for a parameter and not a property

An object may be a default for a parameter, a static variable, a global constant and an attribute argument, and not for a property.

// allowed
public function __construct(
    private Logger $logger = new NullLogger(),
) {}

// not allowed
class Service
{
    private Logger $logger = new NullLogger();
    // Fatal: Cannot use "new" in initializer
}

// because a property default is evaluated ONCE per class,
// not once per instance — the object would be shared.

The exclusion is a consequence of when defaults are evaluated rather than an arbitrary restriction, and knowing the reason makes the rule memorable. The benefit at the parameter position is that the type stops being nullable, so every line after the constructor stops checking — which is a larger improvement than removing one line of null coalescing.