Slide 1

Slide 1 text

P H P CO N F. A S I A K E Y N OT E CC-BY-ND 2.0: Michaela Loheit

Slide 2

Slide 2 text

h tt p : / /d e v e l o p e r. a ka m a i .co m

Slide 3

Slide 3 text

Let’s start a conversation about mental health in tech mhprompt.org

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

R E L E A S E M A N A G E R

Slide 6

Slide 6 text

P H P I S D E A D CC-BY 2.0: Nana B Agyei

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

J AVA S C R I PT I S T H E F U T U R E

Slide 14

Slide 14 text

J AVA S C R I PT I S W I N N I N G 2004 2016

Slide 15

Slide 15 text

J AVA S C R I PT I S 2004 2016

Slide 16

Slide 16 text

W H AT A B O U T P H P ?

Slide 17

Slide 17 text

P H P I S Source: Google Trends 2016 2004

Slide 18

Slide 18 text

P H P I S J AVA S C R I PT Source: Google Trends 2016 2004

Slide 19

Slide 19 text

N E W L A N G UAG E S A R E W I N N I N G

Slide 20

Slide 20 text

R UST I S W I N N I N G 2012 2016 Source: Google Trends

Slide 21

Slide 21 text

R UST I S W I N N I N G 2012 2016 Source: Google Trends

Slide 22

Slide 22 text

G O L A N G I S W I N N I N G Source: Google Trends 2010 2016

Slide 23

Slide 23 text

G O L A N G I S W I N N I N G 2010 2016 Source: Google Trends

Slide 24

Slide 24 text

G O L A N G V S R UST 2010 2016 Golang Rust Source: Google Trends

Slide 25

Slide 25 text

G O L A N G V S R UST V S P H P 2010 2016 Rust Golang PHP Source: Google Trends

Slide 26

Slide 26 text

M AY B E I T ’ S T H E PA R A D I G M ?

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

M AY B E I T ’ S T H E S K I L LS E T !

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

R I P H P ? CC-BY 2.0: johnny myreng henriksen

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

P H P U S A G E PHP ASP.NET Java Static Files Coldfusion Ruby Other 1% 0.6% 0.7% 1.5% 2.7% 15.8% 82.1% Source: w3techs

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

CO N T E XT: 1 2 M O N T H S

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

P H P 7 : T H E F I RST 1 2 M O N T H S PHP 7 PHP 5 Source: Google Trends PHP 5.0/7.0 Release

Slide 42

Slide 42 text

T H I R D - PA RTY E CO SYST E M

Slide 43

Slide 43 text

PAC K AG I ST: PA C KA G E S & R E L E A S E S 0K 150K 300K 450K 600K 2011-09 2011-12 2012-03 2012-06 2012-09 2012-12 2013-03 2013-06 2013-09 2013-12 2014-03 2014-06 2014-09 2014-12 2015-03 2015-06 2015-09 2015-12 2016-03 2016-06 568K 105K Packages Versions Source: Packagist

Slide 44

Slide 44 text

PAC K AG I ST: PA C KA G E I N STA L LS ( AV E R AG E / D AY ) 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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

P R E D I CTA B L E & CO N S I ST E N T CC-BY-SA: InSapphoWeTrust

Slide 47

Slide 47 text

L AT E STAT I C B I N D I N G

Slide 48

Slide 48 text

U N I F O R M VA R I A B L E SY N TA X

Slide 49

Slide 49 text

L A N G UA G E S P E C I F I C AT I O N

Slide 50

Slide 50 text

CO N C I S E CC-BY 2.0: Dean Hochman

Slide 51

Slide 51 text

C LO S U R E S

Slide 52

Slide 52 text

C A L L A B L E S

Slide 53

Slide 53 text

T R A I TS

Slide 54

Slide 54 text

G E N E R ATO RS

Slide 55

Slide 55 text

A N O N Y M O US C L A SS E S

Slide 56

Slide 56 text

R E L I A B L E CC-BY 2.0: mpclemens

Slide 57

Slide 57 text

S H A R E D - N OT H I N G A R C H I T E CT U R E

Slide 58

Slide 58 text

P H P- F P M

Slide 59

Slide 59 text

D E B U G G A B L E CC-BY-SA 2.0: Peter Grima

Slide 60

Slide 60 text

X D E B U G

Slide 61

Slide 61 text

P H P D B G

Slide 62

Slide 62 text

P H P I S N OT E VO LV I N G CC-BY 2.0: Duncan Hull

Slide 63

Slide 63 text

S H O RT E C H O TAG S P H P 5 . 4

Slide 64

Slide 64 text

B I N A R Y N U M B E RS P H P 5 . 4

Slide 65

Slide 65 text

S H O RT A R R AY SY N TA X P H P 5 . 4

Slide 66

Slide 66 text

A R R AY D E R E F E R E N C I N G P H P 5 . 4

Slide 67

Slide 67 text

C LO S U R E $ T H I S B I N D I N G P H P 5 . 4

Slide 68

Slide 68 text

C A L L A B L E TY P E H I N T P H P 5 . 4

Slide 69

Slide 69 text

T R A I TS P H P 5 . 4

Slide 70

Slide 70 text

B U I LT I N C L I S E R V E R P H P 5 . 4

Slide 71

Slide 71 text

L I ST S U P P O RT I N FO R E A C H P H P 5 . 5

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

F I N A L LY B LO C K S P H P 5 . 5

Slide 75

Slide 75 text

E XT/ PA SS W O R D P H P 5 . 5

Slide 76

Slide 76 text

G E N E R ATO RS P H P 5 . 5

Slide 77

Slide 77 text

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 !

Slide 78

Slide 78 text

E X P O N E N T O P E R ATO R ( T _ P O W ) P H P 5 . 6

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

P H P D B G P H P 5 . 6

Slide 81

Slide 81 text

I M P O RT F U N CT I O N S / CO N STA N TS P H P 5 . 6

Slide 82

Slide 82 text

VA R I A D I CS P H P 5 . 6

Slide 83

Slide 83 text

A R G U M E N T U N PAC K I N G ( S P L AT ) P H P 5 . 6

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

R E M O V E P O S I X R E G E X P H P 7 . 0

Slide 86

Slide 86 text

R E M O V E E XT/ M YS Q L P H P 7 . 0

Slide 87

Slide 87 text

2 . 4 X FA ST E R P H P 7 . 0

Slide 88

Slide 88 text

A BST R ACT SY N TA X T R E E P H P 7 . 0

Slide 89

Slide 89 text

U N I F O R M VA R I A B L E SY N TA X P H P 7 . 0

Slide 90

Slide 90 text

E N G I N E E XC E PT I O N S P H P 7 . 0

Slide 91

Slide 91 text

U N I CO D E E S C A P E SY N TA X P H P 7 . 0

Slide 92

Slide 92 text

N U L L COA L E S C E O P E R ATO R P H P 7 . 0

Slide 93

Slide 93 text

B I N D C LO S U R E O N C A L L P H P 7 . 0

Slide 94

Slide 94 text

G R O U P US E D E C L A R AT I O N S P H P 7 . 0

Slide 95

Slide 95 text

G E N E R ATO R D E L E G AT I O N P H P 7 . 0

Slide 96

Slide 96 text

G E N E R ATO R R E T U R N VA LU E S P H P 7 . 0

Slide 97

Slide 97 text

A N O N Y M O US C L A SS E S P H P 7 . 0

Slide 98

Slide 98 text

S C A L A R TY P E H I N TS P H P 7 . 0

Slide 99

Slide 99 text

R E T U R N H I N TS P H P 7 . 0

Slide 100

Slide 100 text

ST R I CT TY P E S P H P 7 . 0

Slide 101

Slide 101 text

S PA C E S H I P O P E R ATO R P H P 7 . 0

Slide 102

Slide 102 text

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

Slide 103

Slide 103 text

T H E F U T U R E Credit: NASA/KSC

Slide 104

Slide 104 text

No content

Slide 105

Slide 105 text

TO O F E W A R G U M E N TS E XC E PT I O N

Slide 106

Slide 106 text

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

Slide 107

Slide 107 text

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

Slide 108

Slide 108 text

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

Slide 109

Slide 109 text

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

Slide 110

Slide 110 text

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

Slide 111

Slide 111 text

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

Slide 112

Slide 112 text

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 on line 6 and defined in on line 1

Slide 113

Slide 113 text

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 on line 4 Hello

Slide 114

Slide 114 text

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

Slide 115

Slide 115 text

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 Error: Too few arguments to function hello(), 0 passed in on line 6 and exactly 1 expected in :2

Slide 116

Slide 116 text

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 (\Error $e) { // Handle exception } 1 2 3 4 5 6 7 8 9 10

Slide 117

Slide 117 text

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 (\Error $e) { // Handle exception } 1 2 3 4 5 6 7 8 9 10

Slide 118

Slide 118 text

function hello($whom) { echo "Hello $whom"; } try { hello(); } catch (\Error $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

Slide 119

Slide 119 text

function hello($whom) { echo "Hello $whom"; } try { hello(); } catch (\Error $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

Slide 120

Slide 120 text

function hello($whom, $when) { echo "Hello $whom, have a good $when"; } try { $args = ['World']; hello(... $args); } catch (\Error $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

Slide 121

Slide 121 text

function hello($whom, $when) { echo "Hello $whom, have a good $when"; } try { $args = ['World']; hello(... $args); } catch (\Error $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

Slide 122

Slide 122 text

function hello($whom, $when) { echo "Hello $whom, have a good $when"; } try { $args = ['World']; hello(... $args); } catch (\Error $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

Slide 123

Slide 123 text

N E G AT I V E ST R I N G O F FS E TS

Slide 124

Slide 124 text

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

Slide 125

Slide 125 text

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

Slide 126

Slide 126 text

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

Slide 127

Slide 127 text

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

Slide 128

Slide 128 text

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

Slide 129

Slide 129 text

S E T C H A R A CT E RS $string = "abc"; $string[-2] = "z"; // $string == "azc"

Slide 130

Slide 130 text

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 }

Slide 131

Slide 131 text

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

Slide 132

Slide 132 text

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

Slide 133

Slide 133 text

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

Slide 134

Slide 134 text

C LO S U R E F R O M C A L L A B L E

Slide 135

Slide 135 text

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
 {
 ...
 }
 }

Slide 136

Slide 136 text

C LO S I N G OV E R S CO P E

Slide 137

Slide 137 text

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

Slide 138

Slide 138 text

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

Slide 139

Slide 139 text

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

Slide 140

Slide 140 text

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

Slide 141

Slide 141 text

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

Slide 142

Slide 142 text

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

Slide 143

Slide 143 text

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

Slide 144

Slide 144 text

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

Slide 145

Slide 145 text

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

Slide 146

Slide 146 text

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

Slide 147

Slide 147 text

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 :

Slide 148

Slide 148 text

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

Slide 149

Slide 149 text

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

Slide 150

Slide 150 text

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

Slide 151

Slide 151 text

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

Slide 152

Slide 152 text

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

Slide 153

Slide 153 text

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

Slide 154

Slide 154 text

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

Slide 155

Slide 155 text

B E T T E R E R R O R H A N D L I N G

Slide 156

Slide 156 text

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

Slide 157

Slide 157 text

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

Slide 158

Slide 158 text

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 :

Slide 159

Slide 159 text

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 :

Slide 160

Slide 160 text

C L A SS CO N STA N T V I S I B I L I TY

Slide 161

Slide 161 text

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

Slide 162

Slide 162 text

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

Slide 163

Slide 163 text

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

Slide 164

Slide 164 text

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

Slide 165

Slide 165 text

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

Slide 166

Slide 166 text

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

Slide 167

Slide 167 text

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

Slide 168

Slide 168 text

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

Slide 169

Slide 169 text

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() { } }

Slide 170

Slide 170 text

C ATC H I N G M U LT I P L E E XC E PT I O N S

Slide 171

Slide 171 text

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

Slide 172

Slide 172 text

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

Slide 173

Slide 173 text

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

Slide 174

Slide 174 text

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

Slide 175

Slide 175 text

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

Slide 176

Slide 176 text

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

Slide 177

Slide 177 text

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

Slide 178

Slide 178 text

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

Slide 179

Slide 179 text

L I S T ( ) I M P R OV E M E N TS

Slide 180

Slide 180 text

S P E C I F Y I N G K E YS I N L I S T ( )

Slide 181

Slide 181 text

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

Slide 182

Slide 182 text

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

Slide 183

Slide 183 text

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

Slide 184

Slide 184 text

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

Slide 185

Slide 185 text

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

Slide 186

Slide 186 text

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

Slide 187

Slide 187 text

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

Slide 188

Slide 188 text

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

Slide 189

Slide 189 text

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

Slide 190

Slide 190 text

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'

Slide 191

Slide 191 text

S K I P P I N G N U M E R I C K E YS

Slide 192

Slide 192 text

S K I P P I N G N U M E R I C K E YS list( , $lat, $long, , , $name ) = getLocation();

Slide 193

Slide 193 text

S K I P P I N G N U M E R I C K E YS list( , $lat, $long, , , $name ) = getLocation();

Slide 194

Slide 194 text

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

Slide 195

Slide 195 text

S H O RT L I ST ( ) SY N TA X

Slide 196

Slide 196 text

S H O RT L I ST ( ) SY N TA X list('lat' => $lat, 'long' => $long) = $coords;

Slide 197

Slide 197 text

S H O RT L I ST ( ) SY N TA X ['lat' => $lat, 'long' => $long] = $coords;

Slide 198

Slide 198 text

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

Slide 199

Slide 199 text

I T E R A B L E PS U E D OTY P E

Slide 200

Slide 200 text

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

Slide 201

Slide 201 text

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

Slide 202

Slide 202 text

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

Slide 203

Slide 203 text

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

Slide 204

Slide 204 text

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

Slide 205

Slide 205 text

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

Slide 206

Slide 206 text

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

Slide 207

Slide 207 text

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

Slide 208

Slide 208 text

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

Slide 209

Slide 209 text

V O I D R E T U R N TY P E

Slide 210

Slide 210 text

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

Slide 211

Slide 211 text

function return_nothing(): void {
 return null;
 } V O I D R E T U R N TY P E

Slide 212

Slide 212 text

function return_nothing(): void {
 return null;
 } V O I D R E T U R N TY P E

Slide 213

Slide 213 text

function return_nothing(): void {
 return null;
 } V O I D R E T U R N TY P E

Slide 214

Slide 214 text

function return_nothing(): void {
 return null;
 } V O I D R E T U R N TY P E

Slide 215

Slide 215 text

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

Slide 216

Slide 216 text

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

Slide 217

Slide 217 text

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
 }

Slide 218

Slide 218 text

N U L L A B L E TY P E S

Slide 219

Slide 219 text

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)

Slide 220

Slide 220 text

function hello(string $whom)
 {
 echo "Hello " . ($whom ?? "World");
 } hello(); N U L L A B L E TY P E S

Slide 221

Slide 221 text

function hello(string $whom)
 {
 echo "Hello " . ($whom ?? "World");
 } hello(); N U L L A B L E TY P E S

Slide 222

Slide 222 text

function hello(string $whom)
 {
 echo "Hello " . ($whom ?? "World");
 } hello(); N U L L A B L E TY P E S

Slide 223

Slide 223 text

function hello(?string $whom)
 {
 echo "Hello " . ($whom ?? "World");
 } hello(); N U L L A B L E TY P E S

Slide 224

Slide 224 text

function hello(?string $whom)
 {
 echo "Hello " . ($whom ?? "World");
 } hello(); N U L L A B L E TY P E S

Slide 225

Slide 225 text

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 on line 6 and exactly 1 expected in :2

Slide 226

Slide 226 text

N U L L A B L E TY P E S function hello(?string $whom)
 {
 echo "Hello " . ($whom ?? "World");
 } hello();

Slide 227

Slide 227 text

N U L L A B L E TY P E S function hello(?string $whom)
 {
 echo "Hello " . ($whom ?? "World");
 } hello(null);

Slide 228

Slide 228 text

N U L L A B L E TY P E S function hello(?string $whom)
 {
 echo "Hello " . ($whom ?? "World");
 } hello(null);

Slide 229

Slide 229 text

N U L L A B L E TY P E S function hello(?string $whom
 {
 echo "Hello " . ($whom ?? "World");
 } hello( ) ); null

Slide 230

Slide 230 text

N U L L A B L E TY P E S function hello(?string $whom
 {
 echo "Hello " . ($whom ?? "World");
 } hello( = null) );

Slide 231

Slide 231 text

N U L L A B L E R E T U R N TY P E S

Slide 232

Slide 232 text

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

Slide 233

Slide 233 text

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

Slide 234

Slide 234 text

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

Slide 235

Slide 235 text

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

Slide 236

Slide 236 text

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

Slide 237

Slide 237 text

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

Slide 238

Slide 238 text

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

Slide 239

Slide 239 text

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

Slide 240

Slide 240 text

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

Slide 241

Slide 241 text

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

Slide 242

Slide 242 text

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

Slide 243

Slide 243 text

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

Slide 244

Slide 244 text

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;

Slide 245

Slide 245 text

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

Slide 246

Slide 246 text

CU R R E N T: P H P 7 . 1 . 0 B E TA 3

Slide 247

Slide 247 text

G O T E ST !

Slide 248

Slide 248 text

B E YO N D P H P 7 . 1

Slide 249

Slide 249 text

No content

Slide 250

Slide 250 text

CU R R E N T LY 2 6 R FCS ( A N D O N E F O R P H P 8 . 0 ! )

Slide 251

Slide 251 text

W E W A N T YO U ! Credit: NASA

Slide 252

Slide 252 text

No content

Slide 253

Slide 253 text

6 0 % + M A R K E T S H A R E

Slide 254

Slide 254 text

H U G E P E R FO R M A N C E W I N S

Slide 255

Slide 255 text

M U LT I P L E X I N G CC-BY: vadikunc

Slide 256

Slide 256 text

S E R V E R P US H CC-BY: Steven Depolo

Slide 257

Slide 257 text

N E W A R C H I T E CT U R E & T E C H N I Q U E S

Slide 258

Slide 258 text

A SY N C H R O N O US / PA R A L L E L

Slide 259

Slide 259 text

W E A R E A CO M M U N I TY

Slide 260

Slide 260 text

I N S U M M A R Y

Slide 261

Slide 261 text

M I D - N O V E M B E R 2 0 1 6

Slide 262

Slide 262 text

T H E F U T U R E I S A W E S O M E ! CC-BY-SA: Steven Gerner

Slide 263

Slide 263 text

No content

Slide 264

Slide 264 text

M AY B E Y O U ? R E L E A S E M A N A G E R

Slide 265

Slide 265 text

T H A N K YO U ! Twitter: Email: Slides: @dshafik [email protected] http://daveyshafik.com/slides