Movatterモバイル変換


[0]ホーム

URL:


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

PHPに型推論を実装する ~入門編~ / Type inference on PHP

Avatar for 久保田光則 久保田光則
May 21, 2016

PHPに型推論を実装する ~入門編~ / Type inference on PHP

PHPカンファレンス福岡2016の資料です。

Avatar for 久保田光則

久保田光則

May 21, 2016
Tweet

More Decks by 久保田光則

See All by 久保田光則

Other Decks in Programming

See All in Programming

Featured

See All Featured

Transcript

  1. 1)1ʹܕਪ࿦Λ࣮૷͢Δʙೖ໳ฤʙ ٱอాޫଇ!BOBUPP

  2. ࣗݾ঺հ w ٱอాޫଇ!BOBUPP w 6*69σβΠφʔ݉
 ιϑτ΢ΣΞΤϯδχΞ w "TQFDUJWF--$୅ද w IUUQBTQFDUJWFJP

  3. w "TQFDUJWF--$͸1)1ΧϯϑΝϨϯε෱Ԭʹڠࢍ͍ͯ͠·͢

  4. ޷ධൃചதʂ

  5. IUUQPOTFOJP

  6. ΞδΣϯμ w ܕਪ࿦ͱ͸  w ͳͥ1)1Ͱܕਪ࿦  w ಈతݴޠͰͷܕਪ࿦ͷϝϦοτ w

    1)1ͷ"45ͷଘࡏ w ܕਪ࿦ΞϧΰϦζϜͷ঺հ
  7. ܕਪ࿦ͱ͸

  8. ܕਪ࿦8JLJQFEJB IUUQTKBXJLJQFEJBPSHXJLJ&&#&&"&"# lܕਪ࿦ʢ͔͍ͨ͢ΖΜʣͱ͸ϓϩάϥϛϯάݴ ޠͷػೳͷͭͰɺ੩తͳܕ෇͚Λ࣋ͭݴޠʹ ͓͍ͯɺม਺΍ؔ਺ͷܕΛએݴ͠ͳͯ͘΋ͦΕ Λಋ͘ͷʹ࢖ΘΕͨؔ਺ͷܕγάωνϟͳͲ͔ ΒࣗಈతʹܕΛܾఆ͢Δػߏͷ͜ͱɻz

  9. ྫ4XJGU w ܕ৘ใΛॻ͔ͳͯ͘΋ܕΛਪ࿦ͯ͠ίϯύΠϧͯ͘͠ΕΔ w ͋͘·Ͱ੩తܕ෇͚ͳͷͰpC/VNCFSͷܕ͸*OU func fib(number: Int) -> Int

    { if number <= 1 { return number } else { return fib(number - 1) + fib(number - 2) } } var fibNumber = fib(8)
  10. ܕਪ࿦Λ࣋ͭݴޠ w 4DBMB w )BTLFMM w 0$BNM w 4XJGU w

    શͯ੩తܕ෇͚ͷݴޠ
  11. ಈతܕ෇͚ݴޠͰ͸ w 1)1͸ಈతܕ෇͚ݴޠ w ίϯύΠϧ࣌ʹܕ͕ܾ·Δඞཁ͸ͳ͍ w ܕਪ࿦Λॻ͘ඞཁͳΜͯͳ͍ͷͰ͸

  12. w ಈతܕ෇͚ͷݴޠͰ΋ܕਪ࿦ͷϝϦοτ͸ ͋Δ w ͱ͍͏͔ɺ͢ͰʹΈͳ͞Μ࣮͸ܕਪ࿦ͷԸ ܙΛҰ෦त͔͍ͬͯΔ

  13. ಈతݴޠͰͷϝϦοτ w ίϯύΠϧ࣌࠷దԽ w ΤσΟλ΍*%&Ͱͷิ׬ w ࣄલͷΤϥʔݕ஌

  14. ίϯύΠϧ࣌࠷దԽ w ಈతݴޠͰ͸ɺ࣮ߦ࣌ʹͲͷܕ͕ೖͬͯ΋ ໰୊ͳ࣮͘ߦͰ͖ΔΑ͏ʹઃܭ͞Ε͍ͯΔ w ͦͷͨΊ࣮ߦ࣌ͷ੩తܕ෇͚ݴޠʹൺ΂Δ ͱΦʔόʔϔου͕େ͖͍

  15. ྫ1)1ͷ ԋࢉࢠͷॲཧ

  16. IUUQTHJUIVCDPNQIQQIQTSDCMPCNBTUFS;FOE[FOE@PQFSBUPSTD- w ࣮ߦ࣌ʹͲͷܕͷ૊Έ߹Θ͔ͤΛTXJUDIจͰ෼ذ

  17. ܕਪ࿦Λ࢖͑͹ w ྫ͑͹zB CzͷBͱCͷܕ͕ܕਪ࿦ͰΘ͔Ε ͹ɺίϯύΠϧ࣌ʹͦΕઐ༻ͷߴ଎ͳॲཧ ʹࠩ͠ସ͑Δ͜ͱ͕Ͱ͖Δ͸ͣ w ֦ுϥΠϒϥϦͰΦϓςΟϚΠβॻ࣌͘ʹ ໾ཱͪͦ͏

  18. +4ͰͷྫIUUQSGSOPSHdTIVESBGUTUJQEG

  19. *%&Ͱͷϝιουͷิ׬ w *%& 1IQ4UPSNͱ͔ Ͱɺ͋Δม਺ͷΠϯελϯεϝιου ͕ิ׬͞ΕΔͷ͸ɺܕਪ࿦͞Ε͍ͯΔ͔ΒʹଞͳΒͳ͍

  20. Τϥʔݕ஌ɾ-JOU w ܕਪ࿦Ͱܕͷໃ६͕ݟ͔ͭΕ͹ɺ࣮ߦલʹ ΤϥʔΛग़͢͜ͱ͕Ͱ͖Δ w *%&΍ΤσΟλͷΤϥʔݕ஌΍ɺ-JOUπʔϧ ͳͲͰԠ༻Ͱ͖Δ

  21. ༻్·ͱΊ w ิ׬΍MJOUπʔϧͳͲɺ։ൃऀΛࢧԉ͢Δ੩ తղੳπʔϧͷ࣮૷ʹ໾ཱͯΒΕΔ w ֦ுϥΠϒϥϦͰ͕Μ͹Ε͹ɺ࠷దԽ͞Ε ͨPQDPEFΛు͘ࣄ΋Մೳ

  22. 1)1Ͱͷػӡ

  23. 1)1Ͱͷػӡ w 4DBMBS5ZQF)JOUT͕ಋೖ͞Εͨ w ؔ਺ͷฦΓ஋ͷܕΛࢦఆ͕Մೳʹ w ݫີͳܕνΣοΫͷಋೖ w "45 ந৅ߏจ໦

    ͷಋೖ
  24. 4DBMBS5ZQF)JOUT w JOU΍qPBU΍TUSJOH΍CPPMͳͲͷεΧϥ஋ͷܕ͕5ZQF)JOUͰ ࢦఆͰ͖Δ w ࣗಈతʹΩϟετ͞ΕΔΏΔ͍λΠϓνΣοΫ <?php function square(int $i)

    { return $i * $i; } square(3); // => 9 square(4.1); // => 16
  25. ؔ਺ͷ໭Γܕ w ؔ਺ͷ໭Γ஋ͷܕ΋ࢦఆͰ͖ΔΑ͏ʹͳͬ ͨ <?php function foo(): array { return

    [1, 2, 3]; } foo();
  26. ݫ֨ͳܕࢦఆ w એݴͨ͠ϑΝΠϧͰ͸ܕ͕ݫ֨ʹѻΘΕΔ w ҉໧ͷΩϟετ͕ߦΘΕͳ͍Ϟʔυʹ <?php declare(strict_types=1); function add(int $a,

    int $b): int { return $a + $b; } add(1.0, 2.0); // Τϥʔ
  27. 1)1Ͱͷܕͷѻ͍ͷมԽ w ໭Γ஋ͷܕνΣοΫΛએݴͰ͖ΔΑ͏ʹͳͬͨ w ݫີʹએݴͰ͖ΔΑ͏ʹͳͬͨ w ϓϦϛςΟϒͳ஋ͷܕ͕ࢦఆͰ͖ΔΑ͏ʹͳͬ ͨ w ੩తղੳ͠΍͘͢ͳͬͨ

  28. 1)1ͷ"45 w ैདྷͰ͸ɺ"45͸ੜ੒ͤͣʹ;FOE&OHJOF ༻ͷ໋ྩΛίϯύΠϧ͍ͯͨ͠ w 1)1Ͱ͸ɺίϯύΠϧ࣌ʹ"45Λੜ੒͢Δ Α͏ʹͳͬͨ

  29. "45 ந৅ߏจ໦ ͱ͸ w ύʔεͨ͠ίʔυͷந৅తͳπϦʔߏ଄ͷσʔλ IUUQTpSFCFBSTUVEJPDPNCMPHIPXUPHFUSFBEZGPSQIQIUNM for ($i = 0;

    $i < 4; $i++) { ... }
  30. ࣈ۟ղੳ ߏจղੳίϯύΠϧ ࣮ߦ w 1)1Ͱ͸ɺߏจղੳ͠ͳ͕Β7.༻ίʔυΛੜ੒ w CJTPOͷηϚϯςΟοΫΞΫγϣϯͰ׬݁ τʔΫϯͷϦετΛੜ੒ ύʔεͭͭ͠7.༻ͷ໋ྩΛੜ੒ ಺෦7.Ͱ࣮ߦ

    1)1Ͱͷ࣮ߦͷྲྀΕ
  31. τʔΫϯͷϦετΛੜ੒ ந৅ߏจ໦ "45 ͷੜ੒ ಺෦7.༻ͷ໋ྩΛੜ੒ ಺෦7.Ͱ࣮ߦ ࣈ۟ղੳ ߏจղੳ ίϯύΠϧ ࣮ߦ

    w 1)1Ͱ͸ɺߏจղੳ࣌ʹ͸"45Λੜ੒ w 7.༻ͷίʔυੜ੒͸ͦͷޙʹߦ͏Α͏ʹͳͬͨ 1)1Ͱͷ࣮ߦͷྲྀΕ
  32. 1)1"45֦ுϥΠϒϥϦ w ैདྷίϯύΠϧ͕ऴΘΕ͹"45͸ࣺͯΒΕΔ w 1)1͔ΒͰ΋ந৅ߏจ໦Λѻ͏͜ͱ͕Ͱ͖ ΔΑ͏ʹ͢Δ֦ுϥΠϒϥϦ w ந৅ߏจ໦ΛऔΓग़ͯ͠੩తղੳͰ͖Δ IUUQTHJUIVCDPNOJLJDQIQBTU

  33. ྫ <?php require 'path/to/util.php'; $code ='<?php $var = 42;’ echo

    ast_dump(ast\parse_code( $code, $version=30 )), "\n"; IUUQTHJUIVCDPNOJLJDQIQBTUCMPCNBTUFS3&"%.&NE
  34. ग़ྗ w WBSͱ͍͏ίʔυͷߏจ໦͕औΕ͍ͯΔ w ͜ΕͰ੩తղੳ͠์୊ͩʂ AST_STMT_LIST 0: AST_ASSIGN var: AST_VAR

    name: "var" expr: 42
  35. ܕਪ࿦ͷ֓ཁ

  36. ܕਪ࿦ثͷ௒جຊతͳಈ͖ w  ͱ͍͏දݱΛܕਪ࿦ثʹ༩͑Δ৔߹ w ܕਪ࿦ث͸ɺந৅ߏจ໦ͷܭࢉ΍એݴΛਫ਼ࠪͯ͠ਪ࿦نଇ Λݩʹܕ৘ใΛܭࢉ͍ͯ͘͠   

     JOUFHFS JOUFHFS JOUFHFS
  37. ޡΓ͕͋Δ৔߹ w OFX0CKFDU  ͱ͍͏ίʔυΛਪ࿦ثʹ౉͢৔߹ w ܕϨϕϧͰޡΓ͕͋Ε͹࣮ߦલʹΤϥʔΛग़͢ OFX 0CKFDU 

     &3303 0CKFDU JOUFHFS OFX 0CKFDU
  38. ਪ࿦ͷϙΠϯτ w &YQSFTTJPOͷߏจ໦ͷ຤୺͔Βਪ࿦Λ࢝ΊΔ w ਪ࿦نଇʹԠͯ͡ਪ࿦͍ͯ͘͠ w Θ͔Βͳ͍৔߹ʹ͸ܕม਺Λ෇Ճ w ੍ݶʹԠͯ͡ϢχϑΟέʔγϣϯΛߦ͏ w

    ܕม਺ͷ୅ೖɾΤϥʔͷݕ஌ w ਪ࿦͕Ͱ͖ͨ৔߹ʹ͸ܕ؀ڥʹ൓ө͍ͯ͘͠
  39. ຤୺͔Βਪ࿦͢Δ w ͋ΔܭࢉΛਪ࿦͢Δ৔߹ʹ͸ɺԼ෦ͷϊʔυ͔Βਪ࿦͍ͯ͘͠ w ߏจ໦Λ࠶ؼతʹḷͬͯߦ͘͜ͱͰՄೳ     JOUFHFS

    JOUFHFS   JOUFHFS JOUFHFS JOUFHFS
  40. ਪ࿦نଇʹΑͬͯਪ࿦͍ͯ͘͠ w ྫF ͱF ͷܕ͕JOUͰ͋Δ࣌ɺ F  F ͷܕ͸JOUͰ͋Δ w

    ྫF ͱF ͷܕ͕BSSBZͰ͋Δ࣌ɺ F  F ͷܕ͸BSSBZͰ͋Δ w ྫF ͷܕ͕0CKFDUͱF ͷܕ͕JOUͰ͋Δ࣌ɺλΠϓΤϥʔͰ͋Δ w ߏจ໦ΛͨͲ͍ͬͯ࣌͘ʹਪ࿦نଇΛద༻ w نଇ͸۪௚ʹίʔυΛॻ͍͍ͯ͘ w ܕ͕Θ͔ͬͨΒܕ؀ڥʹ൓ө͍ͯ͘͠
  41. ܕ؀ڥ w ؔ਺΍ΫϥεͳͲͷܕ৘ใΛొ࿥͢Δ৔ॴ w ૊ΈࠐΈؔ਺ͷܕ৘ใ͸༧Ίొ࿥ w ίʔυΛղੳͯ͠ਪ࿦Ͱ͖ͨ݁ՌΛ֨ೲ w ܕਪ࿦ثͷ࣮ߦίϯςΩετΈ͍ͨͳ΋ͷ

  42. ܕ͕Θ͔Βͳ͍৔߹ w Bͷܕ͕Θ͔Βͳ͍ w ܕม਺ΛׂΓ౰ͯͯɺ൑அΛ஗Ԇͤ͞Δ B  JOUFHFS

  43. ܕม਺ w ܕͱͯ͠ѻ͑ΔೖΕ෺ɻޙͰதʹ࣮ࡍͷܕΛ୅ೖͰ͖Δ w ܕ͕Θ͔Βͳ͍৔߹ʹ͸ܕม਺ΛׂΓ౰ͯΔ JOU TUSJOH 'PP

  44. ׂΓ౰ͯΔྫ w ྫ͑͹ؔ਺ͷԾҾ਺΍ฦΓ஋ʹܕ͕ࢦఆ͞ Ε͍ͯͳ͍৔߹ <?php function foobar($a, $b) { ...

    }
  45. ܕม਺΁ͷ୅ೖ w ϢχϑΟέʔγϣϯΛ௨ͯ͡୅ೖ͢Δ JOU =

  46. ϢχϑΟέʔγϣϯ ୯ҰԽ w ܕਪ࿦தʹ૒ํ޲ͷ୅ೖΛߦ͏ͨΊͷ࢓૊Έ w ࣦഊͨ͠৔߹͸ܕϨϕϧͰؒҧ͍͕͋ΔͱΈͳ ͯ͠Τϥʔ w ܕͷ੍ݶ͕͋ΔՕॴͰϢχϑΟέʔγϣϯΛߦ ͏

  47. ϢχϑΟέʔγϣϯ͸ܕͷ੍ ݶ͕͔͔ΔՕॴͰ࣮ߦ͢Δ

  48. ԾҾ਺ͷܕͱҾ਺ͷܕ w OVNͷܕͱBҾ਺ͷܕ͸ಉ͡Ͱͳ͚Ε͹ͳΒͳ͍ <?php declare(strict_types=1); function square(int $a): int {

    ... } echo square($num);
  49. SFUVSOͷܕͱฦΓ஋ͷܕએݴ w SFUVSOͷදݱͷܕͱฦΓ஋ͷܕએݴ͸ಉ͡Ͱͳ ͚Ε͹ͳΒͳ͍ <?php declare(strict_types=1); function foobar(): int {

    return $num; }
  50. ྫ w Կ΋͠ͳ͍ɻܕ͕͋ͬͯΔͷͰେৎ෉ function foobar(): int { return 1; }

    JOUJOU ੒ޭ
  51. ྫ function foobar(): int { return “hoge”; } JOUTUSJOH Τϥʔ

    w ܕ͕͋ͬͯͳ͍ͷͰΤϥʔΛग़͢
  52. ྫ w GPPCBSؔ਺ͷฦΓ஋ͷܕม਺BʹJOU͕୅ೖ͞ΕΔ function foobar() { return 1; } BJOU

    BʹJOUΛ୅ೖ ฦΓ஋ͷܕʹܕม਺BΛׂΓ౰ͯ
  53. ྫ w ΋͠ܕม਺ʹผͷܕ͕͢Ͱʹೖ͍ͬͯΔ৔߹ʹ ͸Τϥʔ function foobar(): int { return $globalNum;

    } JOUC ܕม਺CʹJOUΛ࣮૷ ܕม਺CΛׂΓ౰ͯ
  54. ྫ w Ҿ਺ͷܕͱฦΓ஋ͷܕ͕ಉ͡Ͱ͋Δ͜ͱ͕ਪ࿦ Ͱ͖Δ function foobar($a) { return $a; }

    ED ܕม਺DΛܕม਺Eʹ΋ׂΓ౰ͯΔ ܕม਺DΛׂΓ౰ͯ ฦΓ஋ͷܕʹܕม਺EΛׂΓ౰ͯ
  55. ؔ਺ద༻Ͱਪ࿦Ͱ͖Δྫ w JODؔ਺ͷ໭Γ஋ͷܕ͸ɺؔ਺ຊମΛݟ͚ͨͩͰ͸Θ͔Βͳ͍ w ؔ਺ద༻ͰҾ਺ͷܕݟΔͱॳΊͯ൑໌͢Δ w ؔ਺ద༻ͷࣜΛਪ࿦͢Δͱ͖ʹɺҾ਺ͷܕͱJODؔ਺ͷத਎ Λਪ࿦͠௚͢͜ͱͰJOD  ͷܕ͕Θ͔Δ

    function inc($a) { return $a + 1; }; $n = inc(3);
  56. ͱΓ͋͑ͣҎ্ w ಈతܕ෇͚ͳͷͰɺਪ࿦Ͱ͖Δͱ͜Ζ͚ͩ ෦෼తʹਪ࿦ͯ͠ऴΘΓͰ΋໰୊ͳ͍ w ੩తܕ෇͚ͷݴޠͱ͸ҧͬͯ׬શʹ͢΂ͯ ܕ෇͚͠ͳͯ͘΋ྑ͍ w ϝιουิ׬ͳͲͷ໨తͷͨΊʹ׬ᘳʹਪ ࿦͠Α͏ͱ͢Ε͹͢Δ΄Ͳ೉͘͠ͳΔ

  57. ·ͱΊ w 1)1Ͱ͸"45ͷಋೖͰ੩తղੳ͕͠΍͘͢ ͳͬͨ w ಈతܕ෇͚Ͱ΋ܕਪ࿦Λߦ͏ϝϦοτ͸͋Δ w ࣮ߦલΤϥʔݕ஌ w ίϯύΠϧ࣌࠷దԽ

    w ิ׬ࢧԉ
  58. ·ͱΊ w ܕਪ࿦͸"45Λḷͬͯਪ࿦نଇΛݩʹਪ࿦͍ͯ͘͠ w ؔ਺΍ϝιουͷܕ͸ܕ؀ڥʹొ࿥͍ͯ͘͠ w ͦͷ৔Ͱ͸Θ͔Βͳ͍ܕ͸ɺܕม਺ΛׂΓ౰ͯΔ w Τϥʔͷݕ஌΍ܕม਺΁ͷ୅ೖ͸ϢχϑΟέʔγϣ ϯΛ༻͍Δ

    w ϢχϑΟέʔγϣϯ͸ܕͷ੍ݶ͕͋ΔՕॴͰద༻͢ Δ
  59. ࢒Γ࿩͍ͨ͜͠ͱ w ΑΓৄࡉͳΞϧΰϦζϜ w ଟ૬ܕ΍ OVMMcJOUFHFS Έ͍ͨͳܕͷѻ͍ w ಈతܕ෇͚ͷ৔߹ͷΞϧΰϦζϜͷௐ੔ w

    FWBM͕͋Δͱ୆ແ͠ͳ࿩ w ίϯτϩʔϧϑϩʔΛղੳ͢Δ࿩ w ෼Ͱ͸ෆՄೳ
  60. ը૾ग़యंాਖ਼ඒஉࡔ

  61. None
  62. ͝ਗ਼ௌ͋Γ͕ͱ͏ ͍͟͝·ͨ͠


[8]ページ先頭

©2009-2025 Movatter.jp