Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[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.

Davey Shafik

October 24, 2017
Tweet

More Decks by Davey Shafik

Other Decks in Programming

Transcript

  1. PHP 7.NEXT: 

    THE NEW BITS

    View Slide

  2. D AV E Y S H A F I K
    • Developer
    • Author
    • Open Source Contributor
    • Release Manager for PHP 7.1
    • @dshafik

    View Slide

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

    View Slide

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

    View Slide

  5. R E L E A S E M A N A G E R
    @ D S H A F I K

    View Slide

  6. P H P I S D E A D
    CC-BY 2.0: Nana B Agyei
    @ D S H A F I K

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  31. R I P H P ?
    CC-BY 2.0: johnny myreng henriksen
    @ D S H A F I K

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  38. CO N T E XT: 1 2 M O N T H S
    @ D S H A F I K

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  42. T H I R D - PA RTY E CO SYST E M
    @ D S H A F I K

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  47. L AT E STAT I C B I N D I N G
    @ D S H A F I K

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  55. A N O N Y M O US C L A SS E S
    @ D S H A F I K

    View Slide

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

    View Slide

  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

    View Slide

  58. P H P- F P M
    @ D S H A F I K

    View Slide

  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

    View Slide

  60. X D E B U G
    @ D S H A F I K

    View Slide

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

    View Slide

  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

    View Slide

  63. S H O RT E C H O TAG S
    P H P 5 . 4
    @ D S H A F I K

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  80. P H P D B G
    P H P 5 . 6
    @ D S H A F I K

    View Slide

  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

    View Slide

  82. VA R I A D I CS
    P H P 5 . 6
    @ D S H A F I K

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  104. @ D S H A F I K

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  132. C LO S I N G OV E R S CO P E
    @ D S H A F I K

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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 :
    @ D S H A F I K

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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 :
    @ D S H A F I K

    View Slide

  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 :
    @ D S H A F I K

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  169. L I S T ( ) I M P R OV E M E N TS
    @ D S H A F I K

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  224. B E YO N D P H P 7 . 1
    @ D S H A F I K

    View Slide

  225. @ D S H A F I K

    View Slide

  226. 2 2 R F CS ACC E PT E D
    @ D S H A F I K

    View Slide

  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

    View Slide

  228. W E W A N T YO U !
    Credit: NASA
    @ D S H A F I K

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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
    @ D S H A F I K

    View Slide

  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 on line
    @ D S H A F I K

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    @ D S H A F I K

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  251. I N S U M M A R Y
    @ D S H A F I K

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  255. F E E D B AC K
    Feedback:
    Twitter:
    Email:
    Slides:
    https://joind.in/talk/
    @dshafik
    [email protected]
    http://daveyshafik.com/slides
    3a0f2

    View Slide