JIT on, JIT off, the same Symfony endpoint. Difference within noise. Same for a Laravel endpoint. PHP 8.0 came out yesterday and this was the first thing I checked, because every headline is about the JIT.
Not a scandal. A web request spends its time in I/O, in MySQL, in framework code full of method calls the JIT cannot do much with. JIT is for tight numeric loops, and your controller has none. If you compute fractals in PHP, congratulations. The rest of us can leave it off.
The real release is the language. match returns a value, compares strictly, and refuses to fall through or silently match nothing:
$status = match($code) {
200, 201 => 'ok',
404 => 'missing',
default => throw new UnexpectedResponse($code),
};
Nullsafe, $user?->address?->city, replaces three nested ifs that existed only to avoid a fatal. Constructor promotion removes the ceremony from DTOs: declare the property in the signature and it exists. Union types move int|string from docblock fiction into something the engine checks. Attributes give metadata a native syntax, framework support will take some months.
My favorite change is smaller than all of that. Internal functions now throw on a wrong argument type instead of returning null with a warning. Twenty years of errors that walked quietly through three layers and exploded somewhere unrelated. Now they explode where they happen. Louder failures, closer to the cause. That is what maturity looks like.
Upgrade advice is the usual. Read the migration notes, run the suite on 8.0 in CI now, switch for real when the dependencies say they are ready. The expressiveness is worth it.
The JIT can wait for the fractals. I will still turn it on at some point, just to look at the graph. I know myself.