Slide 1

Slide 1 text

Get Ready for PHP 5.4+ Lorna Mitchell, WordCamp London

Slide 2

Slide 2 text

Some Shiny, Some Gotchas

Slide 3

Slide 3 text

Magic DIR Constant (5.3) Instead of: dirname(__FILE__); Now you can use: __DIR__;

Slide 4

Slide 4 text

Anonymous Functions (5.3) Declare a function in the place where it is used. (you may have seen this in JavaScript)

Slide 5

Slide 5 text

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");

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

Namespaced Library File namespace Lorna; class Nonsense { protected $words = array("wibble", "squeak", "howl", "pop"); public function speak() { return $this->words[ array_rand($this->words)]; } }

Slide 9

Slide 9 text

Namespaced Calling Code include 'lorna/nonsense.php'; use Lorna\Nonsense; $nsense = new Nonsense(); echo $nsense->speak(); $other = new \StdClass();

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

Echo Shortcut (5.4) PHP 5.4 removes short_open_tag config option •

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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"

Slide 15

Slide 15 text

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"

Slide 16

Slide 16 text

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);

Slide 17

Slide 17 text

Easy Password Hashing (5.5) $pass = "secretpassword"; $hashed = password_hash($pass, PASSWORD_DEFAULT); echo $hashed; $2y$10$Q7Rm.Cmcu4lbvI7.C2q4Z.1LLoh4C63vBSfflQt fjs52GxhAc.s/G

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

Built-in OpCache (5.5) Replaces APC - beware this is disabled by default. Turn on opcache.enable and opcache.enable_cli

Slide 20

Slide 20 text

Get Ready for New PHP

Slide 21

Slide 21 text

PHP Peformance

Slide 22

Slide 22 text

Use PHPCodeSniffer Use the PHPCompatibility PHPCS standard Install from https://github.com/wimg/PHPCompatibility and include in your standards directory

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

Lint Check Syntax check your code with new version of PHP Use phing (http://www.phing.info/): Or try my one-liner: find . -name '*.php' | xargs -n1 php -l

Slide 25

Slide 25 text

Serve with PHP Run application with PHP's webserver (5.4+) php -S localhost:8080

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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)

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

Questions? (and resources) Intermediate PHP http://lrnja.net/php-video Contact me: @lornajane or http://lornajane.net