This post is for all that are using CakePHP and anything below PHP 7.4.
In general
The main reason here is that the last version of the PHP 7.x series is the most strict one and prepares you well for the upcoming PHP 8 major and its even more strict behavior.
And I am not even talking about "strict types" mode or param/return types.
Just the general behavior for starters.
Be careful with PHP 8 for the next months, since there will be quite some breaking behavior to watch out for.
Any str_*() method and null instead of a string input can cause now an exception already.
Thus my recommendation: Stick with 7.4 for the time being, it will be supported way into 2022.
None of the PHP 8 features justify such a dramatic jump with potential fallout across your whole application.
But at this point (with PHP 7.2 being EOL now on top) there is no reason to use anything below PHP 7.4 IMO.
You will also improve from the performance improvements.
Libraries and frameworks
As Nikita correctly points out, some frameworks or libraries (used by those frameworks or some of your tools) bump their requirements and minimum PHP versions too aggressively, often without any actual need for it.
There are quite popular but bad players that do that even for fun – very counterproductive to the PHP ecosystem and stability as a whole.
The problem here is that often bugfixes then end up being unreachable for you if you don’t try to stay at least somewhat in the upper range of the current PHP major.
In our current case PHP 7.3 or PHP 7.4 then.
As a generic guideline: Try to stay away from those too aggressive libraries, as they will only create trouble for you.
A wise maintainer will balance the need for new "cool" features with some conservative bumping of minimum versions, and not just jump to PHP 7.4+ or even PHP 8.0+ only right now because of shiny new things that will cause your app to go into the limbo between those requirements. Navigating out of that, replacing libraries where needed, can be a costly undertaking.
Upgrading from CakePHP 2/3
If you are coming from the ORM array world, this will be especially important and useful for you.
So far, there was one big issue in CakePHP apps that I upgraded: They contained silent "dead and broken code" now. Hard to find bugs.
E.g.
echo h($topic->channel['title']);
Even if for some reason the "contain" of channel
was not fetched properly, it would silently do nothing and output an empty string.
No report or notice whatsoever on a completely missing relation.
The array access cloaks this in earlier PHP versions.
But with PHP 7.4:
Notice Error: Trying to access array offset on value of type null
In [/…/templates/…/view.php, line 41]
Now we do get useful debug output, for either test run (locally or in CI), or even just in logs on production.
You can now find those and fix them if you didn’t notice them yet.
This also helps to make upgraded apps way less buggy before deploying the app with "silent issues" that you didn’t spot in QA phase.
The upgrade is simple
For nginx this is especially simple.
You just replace
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
with
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
for example, run /etc/init.d/nginx reload
and it should be up and running the new minor.
Other issues?
I know that e.g. implode()
argument order or a few other PHP internal methods have also been deprecated in parts of their legacy API.
This can also then be adjusted already in an intermediate step before jumping the major for real someday in the future.
Did you spot other issues and helpful strictness that helps you to prepare your app better?
Reach out in the comment section.