Get Ready for New PHP

Get Ready for New PHP

WordCamp London Talk

D33d8bdd9096c80b8d1acca8d28410b5?s=128

Lorna Mitchell

March 17, 2015
Tweet

Transcript

  1. Get Ready for PHP 5.4+ Lorna Mitchell, WordCamp London

  2. Some Shiny, Some Gotchas

  3. Magic DIR Constant (5.3) Instead of: dirname(__FILE__); Now you can

    use: __DIR__;
  4. Anonymous Functions (5.3) Declare a function in the place where

    it is used. (you may have seen this in JavaScript)
  5. 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");
  6. Anonymous Functions Using an anonymous function: $things = array("name" =>

    "Alice", "colour" => "Blue", "origin" => "Dreams"); array_walk($things, function ($value, $key) { echo $key . ": " . $value . "\n"; });
  7. 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
  8. Namespaced Library File namespace Lorna; class Nonsense { protected $words

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

    Nonsense(); echo $nsense->speak(); $other = new \StdClass();
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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"
  15. 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"
  16. 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);
  17. Easy Password Hashing (5.5) $pass = "secretpassword"; $hashed = password_hash($pass,

    PASSWORD_DEFAULT); echo $hashed; $2y$10$Q7Rm.Cmcu4lbvI7.C2q4Z.1LLoh4C63vBSfflQt fjs52GxhAc.s/G
  18. 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
  19. Built-in OpCache (5.5) Replaces APC - beware this is disabled

    by default. Turn on opcache.enable and opcache.enable_cli
  20. Get Ready for New PHP

  21. PHP Peformance

  22. Use PHPCodeSniffer Use the PHPCompatibility PHPCS standard Install from https://github.com/wimg/PHPCompatibility

    and include in your standards directory
  23. 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
  24. 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
  25. Serve with PHP Run application with PHP's webserver (5.4+) php

    -S localhost:8080
  26. PHP's Own Webserver php -S dev.project.local:8080 -t /var/www/cool-project/web -c php-ini.development

    routing.php
  27. 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)
  28. 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
  29. Questions? (and resources) Intermediate PHP http://lrnja.net/php-video Contact me: @lornajane or

    http://lornajane.net