Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Get Ready for New PHP

Get Ready for New PHP

WordCamp London Talk

Lorna Mitchell

March 17, 2015

More Decks by Lorna Mitchell

Other Decks in Technology


  1. Anonymous Functions (5.3) Declare a function in the place where

    it is used. (you may have seen this in JavaScript)
  2. Anonymous Functions The old way: $things = array("name" => "Alice",

    "colour" => "Blue", "origin" => "Dreams"); function formatit($value, $key) { echo $key . ": " . $value . "\n"; } array_walk($things, "formatit");
  3. Anonymous Functions Using an anonymous function: $things = array("name" =>

    "Alice", "colour" => "Blue", "origin" => "Dreams"); array_walk($things, function ($value, $key) { echo $key . ": " . $value . "\n"; });
  4. Namespaces (5.3) Namespaces are for combining libraries in one project.

    • we keep our own code in its own namespace(s) • we can pick-and-mix other people's code • class names don't have crazy long prefixes • combined with PSR standards, they enable Composer
  5. Namespaced Library File namespace Lorna; class Nonsense { protected $words

    = array("wibble", "squeak", "howl", "pop"); public function speak() { return $this->words[ array_rand($this->words)]; } }
  6. Namespaced Calling Code include 'lorna/nonsense.php'; use Lorna\Nonsense; $nsense = new

    Nonsense(); echo $nsense->speak(); $other = new \StdClass();
  7. 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
  8. Echo Shortcut (5.4) PHP 5.4 removes short_open_tag config option •

    <? is never valid - s/<?/<?php/ • <?= is always valid <?= is the same as: <?php echo
  9. Less Nonsense (5.4) Removed in PHP 5.4: • register_globals •

    register_long_arrays • safe_mode • magic_quotes • allow_call_time_pass_reference • y2k_compliance • ereg* functions
  10. Error Reporting: E_STRICT E_ALL includes E_STRICT in PHP 5.4+ You

    can either: 1. Fix your errors 2. Turn it off again using E_ALL & ~E_STRICT
  11. 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 settin You are *required* to use the date.timezone setting or date_default_timezone_set() function. In case you used any of those methods and you are stil warning, you most likely misspelled the timezone ident Fix it by setting date.timezone in php.ini: date.timezone = "Europe/London"
  12. Call Time Pass By Reference PHP Fatal error: Call-time pass-by-reference

    has been This error says "don't pass references in when the function didn't expect them, you fool"
  13. Call Time Pass By Reference You can pass by reference.

    Declare function: 1 function inspire(&$person) { 2 // be inspiring 3 } Call with just $ and not & 1 inspire($current_user);
  14. Easy Password Hashing (5.5) $pass = "secretpassword"; $hashed = password_hash($pass,

    PASSWORD_DEFAULT); echo $hashed; $2y$10$Q7Rm.Cmcu4lbvI7.C2q4Z.1LLoh4C63vBSfflQt fjs52GxhAc.s/G
  15. Easy Password Hashing $existing_hash = '$2y$10$Q7Rm.Cmcu4lbvI7.C2q4Z.1LLoh4C $pass = "secretpassword"; if(password_verify($pass,

    $existing_hash)) echo "All good"; else echo "Go away"; For PHP < 5.5: http://github.com/ircmaxell/password_compat
  16. Built-in OpCache (5.5) Replaces APC - beware this is disabled

    by default. Turn on opcache.enable and opcache.enable_cli
  17. PHP Knows What's Deprecated Turn on E_DEPRECATED on an older

    version to see what's removed in the next version Set with: error_reporting = E_ALL
  18. Lint Check Syntax check your code with new version of

    PHP Use phing (http://www.phing.info/): <target name="phplint" description="Run php -l over th <phplint haltonfailure="true"> <fileset dir="src/"> <include name="**/*.php"/> </fileset> </phplint> </target> Or try my one-liner: find . -name '*.php' | xargs -n1 php -l
  19. Use Continuous Integration Builds Use something like http://travis-ci.com to run

    regular builds This can run your build steps for various versions of PHP each time you commit (it's free for open source users)
  20. Check Your Code Is Ready • Use the PHPCompatibility PHPCS

    standard • Turn on E_DEPRECATED and watch the logs of your existing platform • Lint check with new version (php -l) • Run application with PHP's webserver