Slide 1

Slide 1 text

What To Expect From PHP 7 Lorna Mitchell, Froscon 2015 http://www.lornajane.net/resources

Slide 2

Slide 2 text

About PHP 7 PHP 7 is the next major release of PHP • Follows PHP 5.6 (there is no PHP 6) • Currently at RC1 • Due for final release in November 2015 • First major release of PHP since 2004

Slide 3

Slide 3 text

PHP 7 Is Fast

Slide 4

Slide 4 text

PHP 7 Is Fast

Slide 5

Slide 5 text

Why PHP 7 Is Fast • Grew from the phpng project • Influenced by HHVM/Hacklang • Major refactoring of the Zend Engine • More compact data structures throughout • As a result all extensions need updates • http://gophp7.org/gophp7-ext/ Rasmus' stats: http://talks.php.net/fluent15#/6 (or see him later on today!)

Slide 6

Slide 6 text

New Features

Slide 7

Slide 7 text

Combined Comparison Operator The <=> "spaceship" operator is for quick greater/less than comparison. 1 echo 2 <=> 1; // 1 2 echo 2 <=> 3; // -1 3 echo 2 <=> 2; // 0 4 Use it with numbers, strings and even arrays - but not objects.

Slide 8

Slide 8 text

Ternary Shorthand Refresher on this PHP 5 feature: 1 echo $count ? $count : 10; // 10 2 echo $count ?: 10; // 10 3

Slide 9

Slide 9 text

Null Coalesce Operator Operator ?? is ternary shorthand (?:) but with isset(). 1 $b = 16; 2 3 echo $a ?? 2; // 2 4 echo $a ?? $b ?? 7; // 16 5

Slide 10

Slide 10 text

Type Hints PHP 5 has type hinting, allowing you to say what kind of parameter is acceptable in a method call. 1 function myfunc(array $list, $length) { 2 return array_slice($list, 0, $length); 3 } 4

Slide 11

Slide 11 text

Type Hints If we use the wrong parameter types, it errors 1 print_r(myfunc(3, 3)); 2 PHP 5 error: PHP Catchable fatal error: Argument 1 passed to myfunc() must be of the type array, integer given PHP 7 error: Fatal error: Uncaught TypeError: Argument 1 passed to myfunc() must be of the type array, integer given

Slide 12

Slide 12 text

Scalar Type Hints PHP 7 lets us hint more datatypes: • string • int • float • bool

Slide 13

Slide 13 text

Scalar Type Hints We can amend our code accordingly: 1 function myfunc(array $list, int $length) { 2 return array_slice($list, 0, $length); 3 } 4 And then call it: 1 $moves = ['hop', 'skip', 'jump', 'tumble']; 2 print_r(myfunc($moves, "2")); // ['hop', 'skip'] 3

Slide 14

Slide 14 text

Scalar Type Hints To enable strict type check, add this line in the calling context: declare(strict_types=1);

Slide 15

Slide 15 text

Return Type Hints We can also type hint for return values. This is awesome. 1 function myfunc(array $list, int $length): array { 2 if($length > 0) { 3 return array_slice($list, 0, $length); 4 } 5 return false; 6 } 7 Beware that we can't return false or null.

Slide 16

Slide 16 text

Return Type Hints 1 $moves = ['hop', 'skip', 'jump', 'tumble']; 2 print_r(myfunc($moves, "2")); // ['hop', 'skip'] 3 The above works, the below does not: 1 $moves = ['hop', 'skip', 'jump', 'tumble']; 2 print_r(myfunc($moves, 0)); 3 Fatal error: Uncaught TypeError: Return value of myfunc() must be of the type array, boolean returned

Slide 17

Slide 17 text

Exceptions and Errors PHP 5 exceptions are alive, well, and awesome.

Slide 18

Slide 18 text

Exceptions in PHP 7 Very familiar but they now inherit from Throwable.

Slide 19

Slide 19 text

Errors in PHP 7 Some errors are now catchable via the Error class.

Slide 20

Slide 20 text

Catching Exceptions and Errors 1 function somethingFun(int $count, array $list) { 2 throw new Exception("You fail"); 3 } 4 try { 5 $a = somethingFun(1,1); 6 } catch (Exception $e) { 7 echo "you hit the exception line"; 8 } catch (TypeError $e) { 9 echo "you passed the wrong arguments"; } 10

Slide 21

Slide 21 text

Catch Method Calls on Non-Objects Does this error look familiar? 1 $a->grow(); 2 PHP 5: PHP Fatal error: Call to a member function grow() on null PHP 7: Fatal error: Uncaught Error: Call to a member function grow() on unknown

Slide 22

Slide 22 text

Catch Method Calls on Non-Objects 1 try { 2 $a->grow(); 3 } catch (Error $e) { 4 echo "(oops! " . $e->getMessage() . ")\n"; 5 } 6

Slide 23

Slide 23 text

Multiple Import Declarations Syntactic sugar perhaps, but very readable code. Start with: 1 use Symfony\Component\Form\Form; 2 use Symfony\Component\Form\FormError; 3 use Talk\TalkDb; 4 use Talk\TalkApi; 5 use User\UserDb; 6 use User\UserApi; 7

Slide 24

Slide 24 text

Multiple Import Declarations Syntactic sugar perhaps, but very readable code. Now reads: 1 use Symfony\Component\Form\{Form, FormError}; 2 use Talk\{TalkDb, TalkApi}; 3 use User\{UserDb, UserApi}; 4 Group your imports, also supports aliases.

Slide 25

Slide 25 text

No E_STRICT Replaced with either E_DEPRECATED or E_NOTICE or E_WARNING Simplifies error stuff in PHP 7

Slide 26

Slide 26 text

Anonymous Classes Start with this (normal) class: 4 class Logger { 5 public function log($message) { 6 echo $message; 7 } 8 } 9 10 $log1 = new Logger(); 11

Slide 27

Slide 27 text

Anonymous Classes Now consider this anonymous class: 13 $log2 = new class extends Logger { 14 public function log($message) { 15 echo $message . "\n"; 16 } 17 }; 18

Slide 28

Slide 28 text

Anonymous Classes Compare the two in use: 21 $log1->log("one line"); 22 $log1->log("another line"); 23 echo "----\n"; 24 $log2->log("one line"); 25 $log2->log("another line"); 26 one lineanother line---- one line another line

Slide 29

Slide 29 text

Hex Numbers in Strings PHP 7 doesn't detect hex numbers when casting strings to numeric values.

Slide 30

Slide 30 text

Upgrading to PHP 7

Slide 31

Slide 31 text

Upgrading to PHP 7 Step 1: Upgrade to PHP 5.5 or 5.6.

Slide 32

Slide 32 text

Upgrading to PHP 7 Step 1: Upgrade to PHP 5.5 or 5.6. Most PHP 5 code will just work with a few pitfalls to look out for. I expect all modern applications to be upgradeable (and therefore upgraded!).

Slide 33

Slide 33 text

Uniform Variable Syntax This is a feature as well as a gotcha. • Good news: more consistent and complete variable syntax with fast parsing • Bad news: some quite subtle changes from old syntax when dereferencing or using $$ • If in doubt, add more { and } RFC: https://wiki.php.net/rfc/uniform_variable_syntax Static analyser: https://github.com/rlerdorf/phan

Slide 34

Slide 34 text

Foreach Check that you're not relying on any foreach() weirdnesses • The array pointer will no longer move, look out for use of current() and next() inside a foreach() loop • Don't assign to the thing you're looping over, the behaviour has changed RFC: https://wiki.php.net/rfc/php7_foreach

Slide 35

Slide 35 text

Deprecated Features The majority of things that trigger E_DEPRECATED in older versions of PHP are now actually removed. This includes the mysql_* functions. PDO is great, I promise.

Slide 36

Slide 36 text

Upgrading to PHP 7 There are fabulous comprehensive instructions https://github.com/php/php-src/blob/php-7.0.0beta2/ UPGRADING To make the business case: • calculate hardware cost saving • calculate developer time required Done :)

Slide 37

Slide 37 text

PHP 7 and You

Slide 38

Slide 38 text

Use PHP 7 • Use Rasmus' dev box https://github.com/rlerdorf/php7dev • Install using package manager (homebrew, PPAs) • Use Zend's nightly builds for your platform http://php7.zend.com/ • Bitnami LAMP/MAMP stacks http://lrnja.net/1M5fEnH • Compile new PHP yourself https://github.com/php/php-src/

Slide 39

Slide 39 text

How To Test Get PHP 7 and then: • Run your test suites (travis already has PHP 7 available) • Then run your actual PHP 5 applications • Narrow down good replication cases, report bugs to appropriate place Tutorial for putting your project onto php7dev: http://lrnja.net/1MSlFkt

Slide 40

Slide 40 text

PHP 7 Is Coming It's fast and ... fabulous

Slide 41

Slide 41 text

Questions? Feedback please: https://joind.in/15043 Slides are on http://lornajane.net (related blog posts are there too) Contact me • [email protected] • @lornajane