Recent Versions of PHP Version Released End of Life 5.2 November 2006 January 2011 5.3 June 2009 July 2014 5.4 March 2012 September 2015 5.5 June 2013 June 2016 5.6 August 2014 August 2017 7.0 Q4 2015 Release + 3 months
Register Globals is Gone (5.4) Upgrade PHP and see many undefined (simple) variables. To fix each undefined variable: • replace $username with $_GET['username'] or $_POST['username'] in each case
Timezone Settings (5.4) PHP refuses to guess the timezone and will warn you. It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. Fix it by setting date.timezone in php.ini: date.timezone = "Europe/London"
Call Time Pass By Reference PHP Fatal error: Call-time pass-by-reference has been removed This error says "don't pass references in when the function didn't expect them, you fool"
Call Time Pass By Reference You can pass by reference. Declare function: function inspire(&$person) { // be inspiring } Call with just $ and not & inspire($current_user);
Traits To use a trait: use Silex\Application; class MyApplication extends Application { use Application\MonologTrait; $app->log("Something went wrong");
Easy Password Hashing (5.5) $pass = "secretpassword"; $hashed = password_hash($pass, PASSWORD_DEFAULT); echo $hashed; Output: $2y$10$Q7Rm.Cmcu4lbvI7.C2q4Z.1LLoh4C63vBSfflQtfjs52GxhAc.s/G (you may need to make your password columns larger)
PHP Generators (5.5) Simpler than iterators - a function returning a sequence of values. function getValues() { // totally trivial example yield "Apple"; yield "Ball"; yield "Cat"; }
PHP Generators Simpler than iterators - a function returning a sequence of values. $stuff = getValues(); foreach($stuff as $thing) { echo $thing . "\n"; }
MySQL is Deprecated (5.5) The original mysql extension now emits E_DEPRECATED warnings. Instead, use: • PDO • The mysqli extension, which is similar to the original mysql one
Argument Unpacking Let PHP unpack your args $email[] = "Hi there"; $email[] = "Thanks for registering, hope you like it"; mail("[email protected]", ...$email);
Namespaced Functions (5.6) Have always been able to namespace functions Can now import them, like classes include "Lib/Many/Layers/functions.php"; use function \Lib\Many\Layers\deep_func; deep_func();
How To Upgrade • Turn on E_DEPRECATED and watch the logs of your existing platform • Use the PHPCompatibility PHPCS standard • Compile new PHP and run test suite • Lint check with new version (php -l) • Run application with PHP's webserver • Upgrade a test/staging platform • Go for it!
Finding Platforms New projects should be PHP 5.5 or later. Questions to ask: • What versions of PHP are available? • Are backups included? • Which extensions are available, and can I add others? • Can I get support with my PHP setup?