What is this forum for?
You or your host have upgraded PHP and, despite your best efforts, the site has broken, and you can't find what the problem is. Or maybe you're thinking of upgrading, and want some idea of places where the site might break if you do.
A bit of history, and where to find out what happened.
PHP's developers have tried very hard over the years to maintain backward-compatibility, so that scripts written for older versions of PHP will continue to run in newer ones, but they can never be 100% successful. They give advance warning of changes that can break older scripts, and the bigger the change in versions the bigger the version number change. A list of backward-incompatible and other significant changes are chronicled in the [man]history[/man] section of the manual.
The transition from PHP4 to PHP5 was very big: not just in the way objects were passed to functions was completely overhauled to match the way other languages did it, but when PHP 5.0.0 was released in 2004 development of PHP 4 basically stopped. See [man]migration5[/man] for an almost full list.
The transition from 5.0 to 5.1 shook out a lot of the bugs found during use of 5.0, and introduced a number of features that had been put on hold. Backwards compatibility was maintained. An overhaul to date/time handling was introduced, and PDO (the recommended database interaction interface: mysql_query() is just so last century) was enabled by default. [man]migration51[/man]
Version 5.2 made a few changes that were not compatible with 5.1 and a few more rough edges were smoothed out (like having __toString() work as expected instead of only in a couple of special situations). Mostly, however, it was devoted to additional functionality. [man]migration52[/man].
Migrating from 5.2 to 5.3 ([man]migration53[/man]) gives you additional significant features like closures and namespaces (mmm ... closures ...), at the expense of a few backward incompatibilities (e.g., [man]namespace[/man] is now a reserved word).
Migrating to 5.4 (which, not surprisingly, is outlined in [man]migration54[/man]) is a similar jump. It removes a lot of stuff that should have already been removed from any software that is being maintained - things like [man]magic_quotes[/man] and [man]safe_mode[/man] - are gone. It has also adds a number of refinements to the syntax, and things called [man]traits[/man] to ease code reuse across class hierarchies without requiring inheritance.
Speaking of things that are gone, the MySQL extension is now deprecated and notice has been given that the mysql_* functions will be removed in the future; they should not be used in any new software and existing software that uses them should be getting modified now if you don't want to be left stranded .
Migrating from 5.5 to 5.6 is simpler ([man]migration56[/man]); there are only a few things that might break, but mostly only in somewhat esoteric situations. A few more things have been deprecated (most notably for most users, the use of [man]$HTTP_RAW_POST_DATA[/man]). Of greater interest is what has been added: syntax for exponentiation, and a cleaner way of specifying variadic functions (instead of a lot of fiddling around with [man]func_get_args[/man]); namespaces can use functions and constants from other namespaces as well as classes; constants can now be (constant) expressions instead of merely literals; and there is now an inbuilt debugger as well as server.
There is NO PHP6.
When PHP5 was released, development of PHP6 began. The process was publicised and a fair bit was written about the subject, but while development builds appeared the PHP6 project was eventually discarded in favour of cleaning up the language in the PHP5 branch. To avoid confusion with the stillborn PHP6, the release version went straight to PHP7. The decision and a link to the discussion behind it is on https://wiki.php.net/rfc/php6
As befitting a major version, there are a lot of changes. Backward compatibility with PHP5 is still important, but there are more than the usual incompatibilities. A lot of them are to do with cleaning up how the language works, so most of them will only bite people who were writing hairy code to begin with (like [font=monospace] $foo->$bar'baz' [/font]).
The ereg extension is gone. [thread=10387467]The MySQL extension is gone[/thread].
For some people, the most significant change is that many fatal errors have been turned into exceptions: if you have a custom error handler you'll want to check how it behaves; the error will become an "uncaught exception" instead of whatever it was (because pre-PHP7 code won't have a catch block for the new [font=monospace]Error[/font] exception class).
Division by zero now works according to standard floating-point conventions (1/0=INF, -1/0=-INF, 0/0=NAN) but will still trigger a warning. The % operator will throw a DivisionByZero exception if a zero modulus is used.
Now for some good news. Lots of neat stuff. Generator delegation, anonymous classes, more flexible assertion handling, integer division, array constants, a [font=monospace]??[/font] operator that works the way a lot of people thought [font=monospace]?:[/font] should, a type-juggling comparison operator [font=monospace]<=>[/font], scalar (as well as object) type hinting for both function arguments and return values...
Internally, it's a lot less demanding on host infrastructure: it's faster (the claim is twice as fast), mainly due to much less memory use. Oh, and it's 64-bit on 64-bit machines: PHP_INT_MAX=9,223,372,036,854,775,807.
Version 7.1: One of the problems with type hinting as introduced from PHP 5.0 through to 7.0 is that if you specified a type for an argument or return value, you couldn't pass or return NULL. Well, now you can. Also, the [font=monospace][man]list/man[/font] construct can be abbreviated to [font=monospace][$a][/font] just as [man]array[/man] could from 5.4. You can also have associative [man]list[/man] statements. You can control the visibility of class constants, and have a single catch for multiple exception types.
Some things got stricter: not passing enough arguments to a function is now an Error instead of a warning, and some functions are forbidden from being called dynamically. Session key generation was streamlined, resulting in some of its associated .ini directives becoming irrelevant. SSLv2 has been dropped from OpenSSL, and mcrypt was deprecated.
Version 7.2: Speaking of mcrypt, that's now gone; its replacement is either [man]OpenSSL[/man] or the new [man]Sodium[/man] library. Keep going with the former if you're already using and are happy with it, but if you're starting from scratch it won't hurt to look at the latter.
Sodium is the big new thing in this version. Casting arrays to objects or objects to arrays won't cause elements/properties with numeric keys/field names to go wonky. Counting strings and scalar values will trigger a warning (because you know the answer is always going to be 1); for acceptable counting, the thing being counted has to be either an array or an object implementing Countable.
Using bare unquoted words as strings will now trigger a Warning instead of a mere Notice. PHP 8 will make it an Error. [man]__autoload/man [man]create_function/man, [man]each/man, [man]track_errors[/man], and casting to "(unset)" are among the things that have been deprecated in advance of their removal in PHP 8.