[ZendCon 2017] PHP 7.NEXT: The New Bits

[ZendCon 2017] PHP 7.NEXT: The New Bits

PHP 7.0 is old news, PHP 7.1 is the new hotness. As the first point release in the 7.x series, 7.1 will set the tone for future releases of the highly successful PHP 7. PHP 7.1 is shaping up to be an even more feature-filled release than 7.0, join me and walk through what's coming up in the most exciting release yet.

Fee39f0c0ffb29d9ac21607ed188be6b?s=128

Davey Shafik

October 24, 2017
Tweet

Transcript

  1. PHP 7.NEXT: 
 THE NEW BITS

  2. D AV E Y S H A F I K

    • Developer • Author • Open Source Contributor • Release Manager for PHP 7.1 • @dshafik
  3. h tt p : / /d e v e l

    o p e r. a ka m a i .co m
  4. Let’s start a conversation about mental health in tech mhprompt.org

  5. R E L E A S E M A N

    A G E R @ D S H A F I K
  6. P H P I S D E A D CC-BY

    2.0: Nana B Agyei @ D S H A F I K
  7. S I N G L E - PAG E A

    P P L I C AT I O N S A R E T H E F U T U R E @ D S H A F I K
  8. S I N G L E PA G E A

    P P L I C AT I O N S A R E T H E F U T U R E 2011 2016 Source: Google Trends @ D S H A F I K
  9. S I N G L E PA G E A

    P P L I C AT I O N S A R E T H E F U T U R E 2011 2016 Source: Google Trends @ D S H A F I K
  10. C L I E N T S I D E

    M VC F R A M E W O R K S A R E T H E F U T U R E @ D S H A F I K
  11. C L I E N T S I D E

    M V C F R A M E W O R K S A R E T H E F U T U R E 2010 2016 angular react Source: Google Trends @ D S H A F I K
  12. J AVA S C R I PT I S T

    H E F U T U R E @ D S H A F I K
  13. J AVA S C R I PT I S W

    I N N I N G 2004 2016 @ D S H A F I K
  14. J AVA S C R I PT I S 2004

    2016 @ D S H A F I K
  15. W H AT A B O U T P H

    P ? @ D S H A F I K
  16. P H P I S Source: Google Trends 2016 2004

    @ D S H A F I K
  17. P H P I S J AVA S C R

    I PT Source: Google Trends 2016 2004 @ D S H A F I K
  18. N E W L A N G UAG E S

    A R E W I N N I N G @ D S H A F I K
  19. R UST I S W I N N I N

    G 2012 2016 Source: Google Trends @ D S H A F I K
  20. R UST I S W I N N I N

    G 2012 2016 Source: Google Trends @ D S H A F I K
  21. G O L A N G I S W I

    N N I N G Source: Google Trends 2010 2016 @ D S H A F I K
  22. G O L A N G I S W I

    N N I N G 2010 2016 Source: Google Trends @ D S H A F I K
  23. G O L A N G V S R UST

    2010 2016 Golang Rust Source: Google Trends @ D S H A F I K
  24. G O L A N G V S R UST

    V S P H P 2010 2016 Rust Golang PHP Source: Google Trends @ D S H A F I K
  25. M AY B E I T ’ S T H

    E PA R A D I G M ? @ D S H A F I K
  26. O BJ E CT O R I E N T

    E D V S F U N CT I O N A L P R O G R A M M I N G 2004 2016 Object-Oriented Functional Source: Google Trends @ D S H A F I K
  27. O BJ E CT O R I E N T

    E D V S F U N CT I O N A L P R O G R A M M I N G 2004 2016 Object-Oriented Functional Source: Google Trends @ D S H A F I K
  28. M AY B E I T ’ S T H

    E S K I L LS E T ! @ D S H A F I K
  29. F U L L STA C K D E V

    E LO P E R V S 1 0 X E N G I N E E R 2010 2016 Full Stack Developer 10X Engineer Source: Google Trends @ D S H A F I K
  30. F U L L STA C K D E V

    E LO P E R V S 1 0 X E N G I N E E R 2016 10X engineer Full Stack Developer PHP Developer Source: Google Trends @ D S H A F I K
  31. R I P H P ? CC-BY 2.0: johnny myreng

    henriksen @ D S H A F I K
  32. W H AT D O E S P R O

    G R E SS LO O K L I K E ? CC-BY 2.0: damon jah @ D S H A F I K
  33. P H P U S A G E PHP ASP.NET

    Java Static Files Coldfusion Ruby Other 1.1% 0.6% 0.6% 1.5% 2.6% 15.1% 82.6% Source: w3techs (Perl, JavaScript, Python, Erlang) @ D S H A F I K
  34. P H P U S A G E 5.3 5.4

    5.5 5.6 7.0 7.1 17.64% 36.12% 31.44% 10.61% 3.11% 0.98% Source: w3techs @ D S H A F I K
  35. P H P U S A G E 5.x 7.x

    53.76% 46.14% Source: w3techs @ D S H A F I K
  36. P H P R E L E A S E

    S 2 3 4 5 6 7 8 9 2012-02 2012-05 2012-08 2012-11 2013-02 2013-05 2013-08 2013-11 2014-02 2014-05 2014-08 2014-11 2015-02 2015-05 2015-08 2015-11 2016-02 2016-05 Source: php-src git repository @ D S H A F I K
  37. P H P V E RS I O N US

    A G E PHP 7.x PHP 5.x PHP 4.x 1.1% 97.8% 1.2% Source: w3techs @ D S H A F I K
  38. CO N T E XT: 1 2 M O N

    T H S @ D S H A F I K
  39. P H P 5 : T H E F I

    RST 1 2 M O N T H S PHP 5.0 Release Source: Google Trends @ D S H A F I K
  40. P H P 7 : T H E F I

    RST 1 2 M O N T H S PHP 7.0 Release Source: Google Trends @ D S H A F I K
  41. P H P 7 : T H E F I

    RST 1 2 M O N T H S PHP 7 PHP 5 PHP 7.0 Release Source: Google Trends PHP 5.0/7.0 Release @ D S H A F I K
  42. T H I R D - PA RTY E CO

    SYST E M @ D S H A F I K
  43. PAC K AG I ST: PA C KA G E

    S & R E L E A S E S Source: Packagist @ D S H A F I K 0K 150K 300K 450K 600K 2011-09 2012-01 2012-05 2012-09 2013-01 2013-05 2013-09 2014-01 2014-05 2014-09 2015-01 2015-05 2015-09 2016-01 2016-05 568K 105K Packages Versions
  44. PA C K AG I ST: PAC K AG E

    I N STA L LS ( AV E R A G E / M O N T H ) 0M 45M 90M 135M 180M 2012-04 2012-07 2012-10 2013-01 2013-04 2013-07 2013-10 2014-01 2014-04 2014-07 2014-10 2015-01 2015-04 2015-07 2015-10 2016-01 2016-04 169M Source: Packagist @ D S H A F I K
  45. P H P : A F R A C TA

    L O F B A D D E S I G N CC-BY 2.0: Ian Baker A P R I L 9 T H 2 0 1 2 @ D S H A F I K
  46. P R E D I CTA B L E &

    CO N S I ST E N T CC-BY-SA: InSapphoWeTrust @ D S H A F I K
  47. L AT E STAT I C B I N D

    I N G @ D S H A F I K
  48. U N I F O R M VA R I

    A B L E SY N TA X @ D S H A F I K
  49. L A N G UA G E S P E

    C I F I C AT I O N @ D S H A F I K
  50. CO N C I S E CC-BY 2.0: Dean Hochman

    @ D S H A F I K
  51. C LO S U R E S @ D S

    H A F I K
  52. C A L L A B L E S @

    D S H A F I K
  53. T R A I TS @ D S H A

    F I K
  54. G E N E R ATO RS @ D S

    H A F I K
  55. A N O N Y M O US C L

    A SS E S @ D S H A F I K
  56. R E L I A B L E CC-BY 2.0:

    mpclemens @ D S H A F I K
  57. S H A R E D - N OT H

    I N G A R C H I T E CT U R E @ D S H A F I K
  58. P H P- F P M @ D S H

    A F I K
  59. D E B U G G A B L E

    CC-BY-SA 2.0: Peter Grima @ D S H A F I K
  60. X D E B U G @ D S H

    A F I K
  61. P H P D B G @ D S H

    A F I K
  62. P H P I S N OT E VO LV

    I N G CC-BY 2.0: Duncan Hull @ D S H A F I K
  63. S H O RT E C H O TAG S

    P H P 5 . 4 @ D S H A F I K
  64. B I N A R Y N U M B

    E RS P H P 5 . 4 @ D S H A F I K
  65. S H O RT A R R AY SY N

    TA X P H P 5 . 4 @ D S H A F I K
  66. A R R AY D E R E F E

    R E N C I N G P H P 5 . 4 @ D S H A F I K
  67. C LO S U R E $ T H I

    S B I N D I N G P H P 5 . 4 @ D S H A F I K
  68. C A L L A B L E TY P

    E H I N T P H P 5 . 4 @ D S H A F I K
  69. T R A I TS P H P 5 .

    4 @ D S H A F I K
  70. B U I LT I N C L I S

    E R V E R P H P 5 . 4 @ D S H A F I K
  71. L I ST S U P P O RT I

    N FO R E A C H P H P 5 . 5 @ D S H A F I K
  72. A R B I T R A R Y E

    X P R E SS I O N S U P P O RT F O R E M P T Y ( ) P H P 5 . 5 @ D S H A F I K
  73. ST R I N G /A R R AY D

    E R E F E R E N C I N G P H P 5 . 5 @ D S H A F I K
  74. F I N A L LY B LO C K

    S P H P 5 . 5 @ D S H A F I K
  75. E XT/ PA SS W O R D P H

    P 5 . 5 @ D S H A F I K
  76. G E N E R ATO RS P H P

    5 . 5 @ D S H A F I K
  77. L A N G UA G E S P E

    C I F I C AT I O N T H A N K S FAC E B O O K ! @ D S H A F I K
  78. E X P O N E N T O P

    E R ATO R ( T _ P O W ) P H P 5 . 6 @ D S H A F I K
  79. CO N STA N T S C A L A

    R E X P R E SS I O N S P H P 5 . 6 @ D S H A F I K
  80. P H P D B G P H P 5

    . 6 @ D S H A F I K
  81. I M P O RT F U N CT I

    O N S / CO N STA N TS P H P 5 . 6 @ D S H A F I K
  82. VA R I A D I CS P H P

    5 . 6 @ D S H A F I K
  83. A R G U M E N T U N

    PAC K I N G ( S P L AT ) P H P 5 . 6 @ D S H A F I K
  84. R E M O V E A LT E R

    N AT I V E P H P TA G S P H P 7 . 0 @ D S H A F I K
  85. R E M O V E P O S I

    X R E G E X P H P 7 . 0 @ D S H A F I K
  86. R E M O V E E XT/ M YS

    Q L P H P 7 . 0 @ D S H A F I K
  87. 2 . 4 X FA ST E R P H

    P 7 . 0 @ D S H A F I K
  88. A BST R ACT SY N TA X T R

    E E P H P 7 . 0 @ D S H A F I K
  89. U N I F O R M VA R I

    A B L E SY N TA X P H P 7 . 0 @ D S H A F I K
  90. E N G I N E E XC E PT

    I O N S P H P 7 . 0 @ D S H A F I K
  91. U N I CO D E E S C A

    P E SY N TA X P H P 7 . 0 @ D S H A F I K
  92. N U L L COA L E S C E

    O P E R ATO R P H P 7 . 0 @ D S H A F I K
  93. B I N D C LO S U R E

    O N C A L L P H P 7 . 0 @ D S H A F I K
  94. G R O U P US E D E C

    L A R AT I O N S P H P 7 . 0 @ D S H A F I K
  95. G E N E R ATO R D E L

    E G AT I O N P H P 7 . 0 @ D S H A F I K
  96. G E N E R ATO R R E T

    U R N VA LU E S P H P 7 . 0 @ D S H A F I K
  97. A N O N Y M O US C L

    A SS E S P H P 7 . 0 @ D S H A F I K
  98. S C A L A R TY P E H

    I N TS P H P 7 . 0 @ D S H A F I K
  99. R E T U R N H I N TS

    P H P 7 . 0 @ D S H A F I K
  100. ST R I CT TY P E S P H

    P 7 . 0 @ D S H A F I K
  101. S PA C E S H I P O P

    E R ATO R P H P 7 . 0 @ D S H A F I K
  102. CO M B I N E D CO M PA

    R I S O N O P E R ATO R P H P 7 . 0 @ D S H A F I K
  103. P R E S E N T DAY Credit: NASA/KSC

    @ D S H A F I K
  104. @ D S H A F I K

  105. TO O F E W A R G U M

    E N TS E XC E PT I O N @ D S H A F I K
  106. TO O F E W A R G U M

    E N TS E XC E PT I O N • Throw an exception when too few arguments are passed to a user defined function/method regardless of strict types • Backwards compatibility break @ D S H A F I K
  107. TO O F E W A R G U M

    E N TS E XC E PT I O N function hello($whom) { echo "Hello $whom"; } hello(); 1 2 3 4 5 6 @ D S H A F I K
  108. function hello($whom) { echo "Hello $whom"; } hello(); TO O

    F E W A R G U M E N TS E XC E PT I O N 1 2 3 4 5 6 @ D S H A F I K
  109. function hello($whom) { echo "Hello $whom"; } hello(); TO O

    F E W A R G U M E N TS E XC E PT I O N 1 2 3 4 5 6 @ D S H A F I K
  110. function hello($whom) { echo "Hello $whom"; } hello(); TO O

    F E W A R G U M E N TS E XC E PT I O N 1 2 3 4 5 6 @ D S H A F I K
  111. function hello($whom) { echo "Hello $whom"; } hello(); TO O

    F E W A R G U M E N TS E XC E PT I O N 1 2 3 4 5 6 Warning: Missing argument 1 for hello(), called in <file> on line 6 and defined in <file> on line 1
  112. function hello($whom) { echo "Hello $whom"; } hello(); TO O

    F E W A R G U M E N TS E XC E PT I O N 1 2 3 4 5 6 Notice: Undefined variable: what in <file> on line 4 Hello
  113. TO O F E W A R G U M

    E N TS E XC E PT I O N 1 2 3 4 5 6 function hello($whom) { echo "Hello $whom"; } hello(); @ D S H A F I K
  114. function hello($whom) { echo "Hello $whom"; } hello(); TO O

    F E W A R G U M E N TS E XC E PT I O N 1 2 3 4 5 6 Fatal error: Uncaught ArgumentCountError: Too few arguments to function hello(), 0 passed in <file> on line 6 and exactly 1 expected in <file>:2
  115. TO O F E W A R G U M

    E N TS E XC E PT I O N function hello($whom) { echo "Hello $whom"; } try { hello(); } catch (\ArgumentCountError $e) { // Handle exception } 1 2 3 4 5 6 7 8 9 10
  116. function hello($whom) { echo "Hello $whom"; } try { hello();

    } catch (\ArgumentCountError $e) { // Handle exception } TO O F E W A R G U M E N TS E XC E PT I O N 1 2 3 4 5 6 7 8 9 10
  117. function hello($whom) { echo "Hello $whom"; } try { hello();

    } catch (\ArgumentCountError $e) { // Handle exception } TO O F E W A R G U M E N TS E XC E PT I O N 1 2 3 4 5 6 7 8 9 10
  118. function hello($whom, $when) { echo "Hello $whom, have a good

    $when"; } try { $args = ['World']; hello(... $args); } catch (\ArgumentCountError $e) { // Handle exception } TO O F E W A R G U M E N TS E XC E PT I O N 1 2 3 4 5 6 7 8 9 10 11
  119. function hello($whom, $when) { echo "Hello $whom, have a good

    $when"; } try { $args = ['World']; hello(... $args); } catch (\ArgumentCountError $e) { // Handle exception } TO O F E W A R G U M E N TS E XC E PT I O N 1 2 3 4 5 6 7 8 9 10 11
  120. N E G AT I V E ST R I

    N G O F FS E TS @ D S H A F I K
  121. N E G AT I V E ST R I

    N G O F FS E TS • Consistently support negative string offsets • Similar to substr() • In string character accessors • Internal functions @ D S H A F I K
  122. N E G AT I V E ST R I

    N G O F FS E TS $path = "/path/to/somewhere/"; if (substr($path, -1) !== '/') { $path = substr($path, 0, -1); } @ D S H A F I K
  123. N E G AT I V E ST R I

    N G O F FS E TS $path = "/path/to/somewhere/"; if ($path[-1] === '/') { $path = substr($path, 0, -1); } @ D S H A F I K
  124. N E G AT I V E ST R I

    N G O F FS E TS $path = "/path/to/somewhere/"; if ($path{-1} === '/') { $path = substr($path, 0, -1); } @ D S H A F I K
  125. S E T C H A R A CT E

    RS $string = "abc"; $string[-2] = "z"; // $string == "azc" @ D S H A F I K
  126. C H E C K L E N GT H

    if (strlen($_POST['password']) < 8) { // Do something } if (!isset($_POST['password'][7])) { // Do something } if (!isset($_POST['password'][-8])) { // Do something } @ D S H A F I K
  127. if (strlen($_POST['password']) < 8) { // Do something } if

    (!isset($_POST['password'][7])) { // Do something } if (!isset($_POST['password'][-8])) { // Do something } C H E C K L E N GT H @ D S H A F I K
  128. if (strlen($_POST['password']) < 8) { // Do something } if

    (!isset($_POST['password'][7])) { // Do something } if (!isset($_POST['password'][-8])) { // Do something } C H E C K L E N GT H @ D S H A F I K
  129. F U N CT I O N S U P

    P O RT strpos() stripos() substr_count() grapheme_strpos() grapheme_stripos() grapheme_extract() iconv_strpos() file_get_contents() mb_strimwidth() mb_ereg_search_setpos() mb_strpos() mb_stripos() @ D S H A F I K
  130. C LO S U R E F R O M

    C A L L A B L E @ D S H A F I K
  131. C LO S U R E F R O M

    C A L L A B L E class Closure { public static function fromCallable(callable $callable): Closure
 {
 ...
 }
 } @ D S H A F I K
  132. C LO S I N G OV E R S

    CO P E @ D S H A F I K
  133. C LO S I N G O V E R

    S CO P E class Validator { public function getValidatorCallback($validationType) { if ($validationType == 'email') { return [$this, 'emailValidation']; } return [$this, 'genericValidation']; } private function emailValidation($userData) {...} private function genericValidation($userData) {...} } $validator = new Validator(); $callback = $validator->getValidatorCallback('email'); $callback($userData); @ D S H A F I K
  134. C LO S I N G O V E R

    S CO P E class Validator { public function getValidatorCallback($validationType) { if ($validationType == 'email') { return [$this, 'emailValidation']; } return [$this, 'genericValidation']; } private function emailValidation($userData) {...} private function genericValidation($userData) {...} } $validator = new Validator(); $callback = $validator->getValidatorCallback('email'); $callback($userData); @ D S H A F I K
  135. C LO S I N G O V E R

    S CO P E class Validator { public function getValidatorCallback($validationType) { if ($validationType == 'email') { return [$this, 'emailValidation']; } return [$this, 'genericValidation']; } private function emailValidation($userData) {...} private function genericValidation($userData) {...} } $validator = new Validator(); $callback = $validator->getValidatorCallback('email'); $callback($userData); @ D S H A F I K
  136. C LO S I N G O V E R

    S CO P E class Validator { public function getValidatorCallback($validationType) { if ($validationType == 'email') { return [$this, 'emailValidation']; } return [$this, 'genericValidation']; } private function emailValidation($userData) {...} private function genericValidation($userData) {...} } $validator = new Validator(); $callback = $validator->getValidatorCallback('email'); $callback($userData); @ D S H A F I K
  137. C LO S I N G O V E R

    S CO P E class Validator { public function getValidatorCallback($validationType) { if ($validationType == 'email') { return [$this, 'emailValidation']; } return [$this, 'genericValidation']; } private function emailValidation($userData) {...} private function genericValidation($userData) {...} } $validator = new Validator(); $callback = $validator->getValidatorCallback('email'); $callback($userData); @ D S H A F I K
  138. C LO S I N G O V E R

    S CO P E class Validator { public function getValidatorCallback($validationType) { if ($validationType == 'email') { return [$this, 'emailValidation']; } return [$this, 'genericValidation']; } private function emailValidation($userData) {...} private function genericValidation($userData) {...} } $validator = new Validator(); $callback = $validator->getValidatorCallback('email'); $callback($userData); @ D S H A F I K
  139. C LO S I N G O V E R

    S CO P E class Validator { public function getValidatorCallback($validationType) { if ($validationType == 'email') { return [$this, 'emailValidation']; } return [$this, 'genericValidation']; } private function emailValidation($userData) {...} private function genericValidation($userData) {...} } $validator = new Validator(); $callback = $validator->getValidatorCallback('email'); $callback($userData); @ D S H A F I K
  140. C LO S I N G O V E R

    S CO P E class Validator { public function getValidatorCallback($validationType) { if ($validationType == 'email') { return [$this, 'emailValidation']; } return [$this, 'genericValidation']; } private function emailValidation($userData) {...} private function genericValidation($userData) {...} } $validator = new Validator(); $callback = $validator->getValidatorCallback('email'); $callback($userData); @ D S H A F I K
  141. C LO S I N G O V E R

    S CO P E class Validator { public function getValidatorCallback($validationType) { if ($validationType == 'email') { return [$this, 'emailValidation']; } return [$this, 'genericValidation']; } private function emailValidation($userData) {...} private function genericValidation($userData) {...} } $validator = new Validator(); $callback = $validator->getValidatorCallback('email'); $callback($userData); @ D S H A F I K
  142. C LO S I N G O V E R

    S CO P E Fatal error: Uncaught Error: Call to private method Validator::emailValidation() from context '' in <file>:<line> @ D S H A F I K
  143. C LO S I N G O V E R

    S CO P E class Validator { public function getValidatorCallback($validationType) { if ($validationType == 'email') { return [$this, 'emailValidation']; } return [$this, 'genericValidation']; } private function emailValidation($userData) {...} private function genericValidation($userData) {...} } $validator = new Validator(); $callback = $validator->getValidatorCallback('email'); $callback($userData); @ D S H A F I K
  144. C LO S I N G O V E R

    S CO P E class Validator { public function getValidatorCallback($validationType) { if ($validationType == 'email') { return [$this, 'emailValidation']; } return [$this, 'genericValidation']; } public function emailValidation($userData) {...} public function genericValidation($userData) {...} } $validator = new Validator(); $callback = $validator->getValidatorCallback('email'); $callback($userData); @ D S H A F I K
  145. C LO S I N G O V E R

    S CO P E class Validator { public function getValidatorCallback($validationType) { if ($validationType == 'email') { return [$this, 'emailValidation']; } return [$this, 'genericValidation']; } private function emailValidation($userData) {...} private function genericValidation($userData) {...} } $validator = new Validator(); $callback = $validator->getValidatorCallback('email'); $callback($userData); @ D S H A F I K
  146. C LO S I N G O V E R

    S CO P E class Validator { public function getValidatorCallback($validationType) { if ($validationType == 'email') { return Closure::fromCallable([$this, 'emailValidation']); } return Closure::fromCallable([$this, 'genericValidation']); } private function emailValidation($userData) {...} private function genericValidation($userData) {...} } $validator = new Validator(); $callback = $validator->getValidatorCallback('email'); $callback($userData); @ D S H A F I K
  147. C LO S I N G O V E R

    S CO P E class Validator { public function getValidatorCallback($validationType) { if ($validationType == 'email') { return Closure::fromCallable([$this, 'emailValidation']); } return Closure::fromCallable([$this, 'genericValidation']); } private function emailValidation($userData) {...} private function genericValidation($userData) {...} } $validator = new Validator(); $callback = $validator->getValidatorCallback('email'); $callback($userData); @ D S H A F I K
  148. B E T T E R E R R O

    R H A N D L I N G @ D S H A F I K
  149. B E T T E R E R R O

    R H A N D L I N G class Validator { public function getValidatorCallback($validationType) { if ($validationType == 'email') { return Closure::fromCallable([$this, 'emailValidation']); } return Closure::fromCallable([$this, 'genericValidation']); } private function emailValidation($userData) {...} private function genericValidation($userData) {...} } $validator = new Validator(); $callback = $validator->getValidatorCallback('email'); $callback($userData); @ D S H A F I K
  150. B E T T E R E R R O

    R H A N D L I N G class Validator { public function getValidatorCallback($validationType) { if ($validationType == 'email') { return Closure::fromCallable([$this, 'emailValdation']); } return Closure::fromCallable([$this, 'genericValidation']); } private function emailValidation($userData) {...} private function genericValidation($userData) {...} } $validator = new Validator(); $callback = $validator->getValidatorCallback('email'); $callback($userData); @ D S H A F I K
  151. B E T T E R E R R O

    R H A N D L I N G TypeError: Failed to create closure from callable: class 'Validator' does not have a method 'emailValdation' in <file>:<line> @ D S H A F I K
  152. B E T T E R E R R O

    R H A N D L I N G TypeError: Failed to create closure from callable: function 'foo' not found or invalid function name in <file>:<line> @ D S H A F I K
  153. C L A SS CO N STA N T V

    I S I B I L I TY @ D S H A F I K
  154. C L A SS CO N STA N T V

    I S I B I L I TY class MyClass { const MY_CONSTANT = 0; const MY_OTHER_CONSTANT = 1; const MY_FAVORITE_CONSTANT = 2; const FOO = 1, BAR = 2; } @ D S H A F I K
  155. C L A SS CO N STA N T V

    I S I B I L I TY class MyClass { public const MY_CONSTANT = 0; protected const MY_OTHER_CONSTANT = 1; private const MY_FAVORITE_CONSTANT = 2; private const FOO = 1, BAR = 2; } @ D S H A F I K
  156. C L A SS CO N STA N T V

    I S I B I L I TY class MyClass { public const MY_CONSTANT = 0; protected const MY_OTHER_CONSTANT = 1; private const MY_FAVORITE_CONSTANT = 2; private const FOO = 1, BAR = 2; } @ D S H A F I K
  157. C L A SS CO N STA N T V

    I S I B I L I TY class MyClass { public const MY_CONSTANT = 0; protected const MY_OTHER_CONSTANT = 1; private const MY_FAVORITE_CONSTANT = 2; private const FOO = 1, BAR = 2; } @ D S H A F I K
  158. C L A SS CO N STA N T V

    I S I B I L I TY class MyClass { public const MY_CONSTANT = 0; protected const MY_OTHER_CONSTANT = 1; private const MY_FAVORITE_CONSTANT = 2; private const FOO = 1, BAR = 2; } @ D S H A F I K
  159. I N T E R FA C E CO N

    STA N T V I S I B I L I TY interface MyInterface { public const MY_CONSTANT = 0; protected const MY_OTHER_CONSTANT = 1; private const MY_FAVORITE_CONSTANT = 2; private const FOO = 1, BAR = 2; } @ D S H A F I K
  160. E N H A N C E M E N

    TS TO R E F L E CT I O N • Added ReflectionClass->getReflectionConstant() • Added ReflectionClass->getReflectionConstants() • Both return ReflectionClassConstant instances @ D S H A F I K
  161. E N H A N C E M E N

    TS TO R E F L E CT I O N class ReflectionClassConstant { public function getName() { } public function getValue() { } public function isPublic() { } public function isPrivate() { } public function isProtected() { } public function getModifiers() { } public function getDeclaringClass() { } public function getDocComment() { } } @ D S H A F I K
  162. C ATC H I N G M U LT I

    P L E E XC E PT I O N S @ D S H A F I K
  163. C ATC H I N G M U LT I

    P L E E XC E PT I O N S try { ... } catch (\PDOException $e) { \My\App::renderError(500); } catch (\My\RequestException $e) { \My\App::renderError(500); } catch (\My\RequestMethodException $e) { \My\App::renderError(405); } @ D S H A F I K
  164. C ATC H I N G M U LT I

    P L E E XC E PT I O N S try { ... } catch (\PDOException $e) { \My\App::renderError(500); } catch (\My\RequestException $e) { \My\App::renderError(500); } catch (\My\RequestMethodException $e) { \My\App::renderError(405); } @ D S H A F I K
  165. C ATC H I N G M U LT I

    P L E E XC E PT I O N S try { ... } catch (\PDOException $e) { \My\App::renderError(500); } catch (\My\RequestException $e) { \My\App::renderError(500); } catch (\My\RequestMethodException $e) { \My\App::renderError(405); } @ D S H A F I K
  166. C ATC H I N G M U LT I

    P L E E XC E PT I O N S try { ... } catch (\PDOException $e) { \My\App::renderError(500); } catch (\My\RequestException $e) { \My\App::renderError(500); } catch (\My\RequestMethodException $e) { \My\App::renderError(405); } @ D S H A F I K
  167. C ATC H I N G M U LT I

    P L E E XC E PT I O N S try { ... } catch (\PDOException $e) { \My\App::renderError(500); } catch (\My\RequestException $e) { \My\App::renderError(500); } catch (\My\RequestMethodException $e) { \My\App::renderError(405); } @ D S H A F I K
  168. C ATC H I N G M U LT I

    P L E E XC E PT I O N S try { ... } catch (\PDOException | \My\RequestException $e) { \My\App::renderError(500); } catch (\My\RequestMethodException $e) { \My\App::renderError(405); } @ D S H A F I K
  169. L I S T ( ) I M P R

    OV E M E N TS @ D S H A F I K
  170. S P E C I F Y I N G

    K E YS I N L I S T ( ) @ D S H A F I K
  171. S P E C I F Y I N G

    K E YS I N L I S T ( ) $coords = [ 'lat' => '1.3521° N', 'long' => '103.8198° E' ]; list($lat, $long) = $coords; var_dump($lat, $long); @ D S H A F I K
  172. S P E C I F Y I N G

    K E YS I N L I S T ( ) $coords = [ 'lat' => '1.3521° N', 'long' => '103.8198° E' ]; list($lat, $long) = $coords; var_dump($lat, $long); Notice: Undefined offset: 0
 Notice: Undefined offset: 1 @ D S H A F I K
  173. S P E C I F Y I N G

    K E YS I N L I S T ( ) $coords = [ 'lat' => '1.3521° N', 'long' => '103.8198° E' ]; list($lat, $long) = $coords; var_dump($lat, $long); $lat === NULL
 $long === NULL @ D S H A F I K
  174. S P E C I F Y I N G

    K E YS I N L I S T ( ) $coords = [ 'lat' => '1.3521° N', 'long' => '103.8198° E' ]; list($lat, $long) = $coords; var_dump($lat, $long); @ D S H A F I K
  175. S P E C I F Y I N G

    K E YS I N L I S T ( ) $coords = [ 'lat' => '1.3521° N', 'long' => '103.8198° E' ]; list('lat' => $lat, 'long' => $long) = $coords; var_dump($lat, $long); @ D S H A F I K
  176. S P E C I F Y I N G

    K E YS I N L I S T ( ) $coords = [ 'lat' => '1.3521° N', 'long' => '103.8198° E' ]; list('lat' => $lat, 'long' => $long) = $coords; var_dump($lat, $long); $lat === '1.3521° N'
 $long === '103.8198° E' @ D S H A F I K
  177. S K I P P I N G N U

    M E R I C K E YS @ D S H A F I K
  178. S K I P P I N G N U

    M E R I C K E YS list( , $lat, $long, , , $name ) = getLocation(); @ D S H A F I K
  179. S K I P P I N G N U

    M E R I C K E YS list( , $lat, $long, , , $name ) = getLocation(); @ D S H A F I K
  180. S K I P P I N G N U

    M E R I C K E YS list( 1 => $lat, 2 => $long, 5 => $name ) = getLocation(); @ D S H A F I K
  181. S H O RT L I ST ( ) SY

    N TA X @ D S H A F I K
  182. S H O RT L I ST ( ) SY

    N TA X list('lat' => $lat, 'long' => $long) = $coords; @ D S H A F I K
  183. S H O RT L I ST ( ) SY

    N TA X ['lat' => $lat, 'long' => $long] = $coords; @ D S H A F I K
  184. S H O RT L I ST ( ) SY

    N TA X : M U T UA L LY E XC LU S I V E SY N TA X // This is not allowed: list([$a, $b], [$c, $d]) = [[1, 2], [3, 4]]; // This is also not allowed: [list($a, $b), list($c, $d)] = [[1, 2], [3, 4]]; // This, however, is allowed: [[$a, $b], [$c, $d]] = [[1, 2], [3, 4]]; // This also: list(list($a, $b), list($c, $d)) = [[1, 2], [3, 4]]; @ D S H A F I K
  185. I T E R A B L E PS U

    E D OTY P E @ D S H A F I K
  186. I T E R A B L E P S

    U E D OTY P E • Similar to callable but values you can foreach, or yield • Accepts any array, or object that implements Traversable • SPL Iterators • Generators • Can be used for return value @ D S H A F I K
  187. I T E R A B L E P S

    U E D OTY P E function enumerate(iterable $args) { foreach ($args as $arg) { echo $args; } } @ D S H A F I K
  188. I T E R A B L E P S

    U E D OTY P E function enumerate(iterable $args) { foreach ($args as $arg) { echo $args; } }
  189. I T E R A B L E P S

    U E D OTY P E : R E T U R N TY P E function compactor(... $args): iterable { return $args; } @ D S H A F I K
  190. I T E R A B L E P S

    U E D OTY P E : R E T U R N TY P E function compactor(... $args): iterable { return $args; } @ D S H A F I K
  191. I T E R A B L E P S

    U E D OTY P E : G E N E R ATO RS function compactor(... $args): iterable { foreach ($args as $arg) { yield $arg; } } @ D S H A F I K
  192. A D D S I S _ I T E

    R A B L E ( ) F U N CT I O N // true is_iterable([1, 2, 3]); is_iterable(new ArrayIterator([1, 2, 3])); is_iterable((function () { yield 1; })()); // false is_iterable(1); is_iterable("Hello World"); is_iterable(new stdClass()); @ D S H A F I K
  193. V O I D R E T U R N

    TY P E @ D S H A F I K
  194. V O I D R E T U R N

    TY P E • PHP functions implicitly return null • There is a semantic difference between returning null, and returning nothing (or not returning) • Void enforces this behavior • Can only be used as a return type • Cannot be changed in sub-classes @ D S H A F I K
  195. function return_nothing(): void {
 return null;
 } V O I

    D R E T U R N TY P E @ D S H A F I K
  196. function return_nothing(): void {
 return null;
 } V O I

    D R E T U R N TY P E @ D S H A F I K
  197. function return_nothing(): void {
 return null;
 } V O I

    D R E T U R N TY P E @ D S H A F I K
  198. V O I D R E T U R N

    TY P E function return_nothing(): void {
 return null;
 } Fatal error: A void function must not return a value (did you mean "return;" instead of "return null;"?) @ D S H A F I K
  199. V O I D R E T U R N

    TY P E function return_nothing(): void {
 return "nothing";
 } Fatal error: A void function must not return a value @ D S H A F I K
  200. V O I D R E T U R N

    TY P E function return_nothing(): void {
 return;
 } // or function return_nothing(): void { // no return
 } @ D S H A F I K
  201. N U L L A B L E TY P

    E S @ D S H A F I K
  202. N U L L A B L E TY P

    E S • Allow specified type, or null • Requires an explicit null, doesn’t default to null • Works for Arguments & Return Types • Prefix type with a ? (question mark) @ D S H A F I K
  203. function hello(string $whom)
 {
 echo "Hello " . ($whom ??

    "World");
 } hello(); N U L L A B L E TY P E S @ D S H A F I K
  204. function hello(string $whom)
 {
 echo "Hello " . ($whom ??

    "World");
 } hello(); N U L L A B L E TY P E S @ D S H A F I K
  205. function hello(?string $whom)
 {
 echo "Hello " . ($whom ??

    "World");
 } hello(); N U L L A B L E TY P E S @ D S H A F I K
  206. function hello(?string $whom)
 {
 echo "Hello " . ($whom ??

    "World");
 } hello(); N U L L A B L E TY P E S @ D S H A F I K
  207. N U L L A B L E TY P

    E S function hello(?string $whom)
 {
 echo "Hello " . ($whom ?? "World");
 } hello(); Fatal error: Uncaught Error: Too few arguments to function hello(), 0 passed in <file> on line 6 and exactly 1 expected in <file>:2
  208. N U L L A B L E TY P

    E S function hello(?string $whom)
 {
 echo "Hello " . ($whom ?? "World");
 } hello(null); @ D S H A F I K
  209. N U L L A B L E TY P

    E S function hello(?string $whom)
 {
 echo "Hello " . ($whom ?? "World");
 } hello(null); @ D S H A F I K
  210. N U L L A B L E TY P

    E S function hello(?string $whom
 {
 echo "Hello " . ($whom ?? "World");
 } hello( = null ) ); null @ D S H A F I K
  211. N U L L A B L E R E

    T U R N TY P E S @ D S H A F I K
  212. N U L L A B L E TY P

    E S function hello(?string $whom): string
 { if ($whom !== null) {
 return "Hello $whom"; } } echo hello("World"); // Hello World @ D S H A F I K
  213. function hello(?string $whom): string
 { if ($whom !== null) {


    return "Hello $whom"; } } echo hello("World"); // Hello World N U L L A B L E TY P E S @ D S H A F I K
  214. function hello(?string $whom): string
 { if ($whom !== null) {


    return "Hello $whom"; } } echo hello("World"); // Hello World N U L L A B L E TY P E S @ D S H A F I K
  215. N U L L A B L E TY P

    E S function hello(?string $whom): string
 { if ($whom !== null) {
 return "Hello $whom"; } } echo hello(null); @ D S H A F I K
  216. N U L L A B L E TY P

    E S TypeError: Return value of hello() must be of the type string, none returned @ D S H A F I K
  217. N U L L A B L E TY P

    E S function hello(?string $whom): string
 { if ($whom !== null) {
 return "Hello $whom"; } } echo hello(null); @ D S H A F I K
  218. N U L L A B L E TY P

    E S function hello(?string $whom): ?string
 { if ($whom !== null) {
 return "Hello $whom"; } } echo hello(null); @ D S H A F I K
  219. N U L L A B L E TY P

    E S TypeError: Return value of hello() must be of the type string, none returned @ D S H A F I K
  220. N U L L A B L E TY P

    E S function hello(?string $whom): ?string
 { if ($whom !== null) {
 return "Hello $whom"; }
 return; } echo hello(null); @ D S H A F I K
  221. N U L L A B L E TY P

    E S Fatal error: A function with return type must return a value (did you mean "return null;" instead of "return;"?) @ D S H A F I K
  222. N U L L A B L E TY P

    E S function hello(?string $whom): ?string
 { if ($whom !== null) {
 return "Hello $whom"; }
 return } echo hello(null); null ; // null @ D S H A F I K
  223. CU R R E N T: P H P 7

    . 1 . 1 0 7 . 1 . 1 1 O N T H U RS D AY @ D S H A F I K
  224. B E YO N D P H P 7 .

    1 @ D S H A F I K
  225. @ D S H A F I K

  226. 2 2 R F CS ACC E PT E D

    @ D S H A F I K
  227. CU R R E N T: P H P 7

    . 2 . 0 R C 4 R C 5 O N T H U RS D AY ! @ D S H A F I K
  228. W E W A N T YO U ! Credit:

    NASA @ D S H A F I K
  229. D E P R E C AT I O N

    S @ D S H A F I K
  230. D E P R E C AT I O N

    S • __autoload() • $php_errormsg (INI: track_errors) • create_function() • mbstring.func_overload • (unset) cast • parse_str() without second argument • gmp_random() • each() • assert() with string argument • $errcontext argument of error handler @ D S H A F I K
  231. B A R E W O R D ST R

    I N G S @ D S H A F I K
  232. B A R E W O R D ST R

    I N G S • Deprecated in PHP 7.2 • Notice changed to Warning • Removed in 8.0 @ D S H A F I K
  233. B A R E W O R D ST R

    I N G S $foo = BAR Notice: Use of undefined constant BAR - assumed 'BAR' on line <line> @ D S H A F I K
  234. B A R E W O R D ST R

    I N G S $foo = BAR Warning: Use of undefined constant BAR - assumed 'BAR' (this will throw an Error in a future version of PHP) in <file> on line <line> @ D S H A F I K
  235. PA R A M E T E R TY P

    E W I D E N I N G @ D S H A F I K
  236. PA R A M E T E R TY P

    E W I D E N I N G • Allow omitting types in extending classes • Allows adding type hints without breaking existing code that extends it • Great for library authors who want to add scalar types @ D S H A F I K
  237. PA R A M E T E R TY P

    E W I D E N I N G class A { public function b($c) { /* ... */ } } class D extends A { public function b($c) { /* ... */ } } @ D S H A F I K
  238. PA R A M E T E R TY P

    E W I D E N I N G class A { public function b(int $c) { /* ... */ } } class D extends A { public function b($c) { /* ... */ } } @ D S H A F I K
  239. PA R A M E T E R TY P

    E W I D E N I N G Warning: Declaration of D::b($c) should be compatible with A::b(int $c) in <file> on line <line> @ D S H A F I K
  240. A R G O N 2 I PA SS W

    O R D H A S H I N G @ D S H A F I K
  241. A R G O N 2 I PA SS W

    O R D H A S H I N G • Adds the argon2i algorithm to ext/password • A new better-than-bcrypt algorithm • May become the default in new versions of PHP (minimum: 7.4) @ D S H A F I K
  242. A R G O N 2 I PA SS W

    O R D H A S H I N G $argon2i$v=19$m=1024,t=2,p=2$ZVF0W mZ3SFBZT2VuM3M3Ng$XNy82lUQq4FqNYCR ykwIluqWhC/qaqYlxVDt96k+nYs password_hash("password", PASSWORD_ARGON2I); @ D S H A F I K
  243. O B J E C T PS U E D

    OTY P E @ D S H A F I K
  244. O B J E C T P S U E

    D OTY P E • Allow argument and return hinting that allows any object • Contravariant arguments: allows widening to the generic object • Covariant return: allows narrowing to specific class type @ D S H A F I K
  245. class Bar { public function foo(object $object) : object {

    return $object; } } class Baz extends Bar { public function foo(Foo $object) : object { return $object; } } O B J E C T P S U E D OTY P E : A R G U M E N TS
  246. class Bar { public function foo(object $object) : object {

    return $object; } } class Baz extends Bar { public function foo(Foo $object) : object { return $object; } } O B J E C T P S U E D OTY P E : A R G U M E N TS
  247. class Bar { public function foo(object $object) : object {

    return $object; } } class Baz extends Bar { public function foo(Foo $object) : object { return $object; } } O B J E C T P S U E D OTY P E : A R G U M E N TS
  248. Warning: Declaration of Baz::foo(Foo $object): object should be compatible with

    Bar::foo(object $object): object O B J E C T P S U E D OTY P E : A R G U M E N TS @ D S H A F I K
  249. class Bar { public function foo(object $object) : object {

    return $object; } } class Baz extends Bar { public function foo(object $object) : Foo { return $object; } } O B J E C T P S U E D OTY P E : R E T U R N TY P E
  250. class Bar { public function foo(object $object) : object {

    return $object; } } class Baz extends Bar { public function foo(object $object) : Foo { return $object; } } O B J E C T P S U E D OTY P E : A R G U M E N TS
  251. I N S U M M A R Y @

    D S H A F I K
  252. I S G R E AT ! @ D S

    H A F I K
  253. C O M I N G S O O N

    ! @ D S H A F I K
  254. T H E F U T U R E I

    S A W E S O M E ! CC-BY-SA: Steven Gerner @ D S H A F I K
  255. F E E D B AC K Feedback: Twitter: Email:

    Slides: https://joind.in/talk/ @dshafik dshafik@akamai.com http://daveyshafik.com/slides 3a0f2