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

PSR が分かってきた

PSR が分かってきた

PHPカンファレンス北海道2016 の発表資料です。
たきゃはし @takahashiyuya
2016/04/16

Yuya Takahashi

April 16, 2016
Tweet

More Decks by Yuya Takahashi

Other Decks in Programming

Transcript

  1. PSR ͕෼͔͖ͬͯͨ
    PHPΧϯϑΝϨϯε๺ւಓ2016

    View Slide

  2. ࣗݾ঺հ
    • ͖ͨΌ͸͠ @takahashiyuya
    • ͱ͕େ޷͖
    • WebσβΠϯɺPHPɺJS

    View Slide

  3. PSR͸
    ίʔσΟϯάن໿
    ͦΜͳ;͏ʹߟ͍͑ͯͨ࣌ظ͕Զʹ΋͋Γ·ͨ͠...

    View Slide

  4. View Slide

  5. View Slide

  6. View Slide

  7. PHPඪ४קࠂ

    View Slide

  8. PHP Standards Recommendations
    • PHPඪ४קࠂɺPHP-FIG ʹΑΓࡦఆ
    • ΦʔτϩʔσΟϯάʢPSR-0, PSR-4ʣ
    • ίʔσΟϯάελΠϧʢPSR-1, PSR-2ʣ

    View Slide

  9. PHP-FIG ౤ථϝϯόʔ
    Agavi
    Assetic and Buzz
    Aura Project and Solar Framework
    CakePHP
    Composer
    concrete5
    Contao Open Source CMS
    Doctrine
    Drupal
    eZ Publish
    Guzzle
    Horde
    IBMi Toolkit
    Icicle
    Jackalope
    Joomla
    Laravel
    The League of Extraordinary Packages
    Lithium
    Magento
    PEAR
    Phalcon
    Phing
    phpBB
    phpDocumentor
    PHPixie
    PPI Framework
    PrestaShop
    Propel
    PyroCMS
    ReactPHP
    Revive Adserver
    sabre/dav
    Sculpin
    SilverStripe
    Slim
    Stash
    Stormpath PHP SDK
    SugarCRM
    Symfony
    Neos and Flow
    Wikibase and Semantic MediaWiki
    Yii framework
    Zend Framework 2
    Zikula
    David Zülke
    Kris Wallsmith
    Paul M. Jones
    Larry Masters
    Jordi Boggiano
    Korvin Szanto
    Leo Feyer
    Guilherme Blanco
    Larry Garfield
    Andre Romcke
    Jeremy Lindblom
    Jan Schneider
    Adam Culp
    Aaron Piotrowski
    Lukas Kahwe Smith
    Robert Deutz
    Taylor Otwell
    Kayla Daniels
    Nate Abele
    Ben Marks
    Chuck Burgess
    Andres Gutierrez
    Michiel Rook
    Nils Adermann
    Mike van Riel
    Roman Tsiupa
    Paul Dragoonis
    Rémi Gaillard
    William Durand
    Ryan Thompson
    Cees-Jan Kiewiet
    Matteo Beccati
    Evert Pot
    Chris Tankersley
    Christopher Pitt
    Josh Lockhart
    Robert Hafner
    Brian Retterer
    Andreas Sandberg
    Bernhard Schussek
    Karsten Dambekalns
    Jeroen De Dauw
    Alexander Makarov
    Matthew Weier O'Phinney
    Shefik Macauley

    View Slide

  10. PHP Standards Recommendations
    • PHPඪ४קࠂɺPHP-FIG ʹΑΓࡦఆ
    • ΦʔτϩʔσΟϯάʢPSR-0, PSR-4ʣ
    • ίʔσΟϯάελΠϧʢPSR-1, PSR-2ʣ

    View Slide

  11. PSR-0 ඇਪ঑

    View Slide

  12. PSR-4

    View Slide

  13. PSR-4
    ΦʔτϩʔσΟϯά
    • ׬શम০Ϋϥε໊͸τοϓϨϕϧ໊લۭؒΛ࣋ͨͳ͚Ε͹ͳΒͣɺ·ͨ͜Ε
    ͸ʮϕϯμʔ໊લۭؒʯͱͯ͠஌ΒΕ͍ͯΔɻ
    • ׬શम০Ϋϥε໊͸̍ͭҎ্ͷαϒ໊લ໊ۭؒΛ࣋ͭ͜ͱ΋Ͱ͖Δɻ
    • ׬શम০Ϋϥε໊͸࠷ޙʹΫϥε໊Λ࣋ͨͳ͚Ε͹ͳΒͳ͍ɻ
    • ׬શम০Ϋϥε໊ͷΞϯμʔείΞ͸ಛผͳҙຯΛ࣋ͨͳ͍ɻ
    • ׬શम০Ϋϥε໊ͷΞϧϑΝϕοτจࣈ͸খจࣈͱେจࣈΛ૊Έ߹ΘͤΔ͜
    ͱ͕Ͱ͖Δɻ
    • ͢΂ͯͷΫϥε໊͸େจࣈͱখจࣈΛ۠ผ͢ΔΑ͏ʹࢀর͞Εͳ͚Ε͹ͳΒ
    ͳ͍ɻ

    View Slide

  14. PSR-4
    ΦʔτϩʔσΟϯάཁ໿
    • τοϓϨϕϧʹϕϯμʔ໊લۭؒΛ࣋ͪɺ̍
    ͭҎ্ͷαϒ໊લ໊ۭؒΛ࣋ͪɺ࠷ޙʹΫϥ
    ε໊Λ࣋ͭΑ͏ʹ namespace Λఆٛ͢Ε͹ɺ
    Φʔτϩʔμʔ͕ϑΝΠϧΛࣗಈతʹಡΈࠐ
    ΜͰ͘ΕΔɻ
    \<ϕϯμʔ໊લۭؒ>(\<αϒ໊લ໊ۭؒ>)*\<Ϋϥε໊>

    View Slide

  15. PSR-1
    PSR-2

    View Slide

  16. PSR-1
    جຊίʔσΟϯάن໿
    • PHPίʔυͷ૬ޓӡ༻ੑΛߴ͍ϨϕϧͰอͭ
    ͨΊʹඞཁͱ͞ΕΔجຊతͳίʔσΟϯάن
    ໿
    • PSR-0(PSR-4)ʹ४ڌ͢Δඞཁ͕͋Δ

    View Slide

  17. PSR-1
    جຊίʔσΟϯάن໿
    • PHPίʔυ͸ • จࣈίʔυ͸UTF-8ʢBOMແ͠ʣ
    • Ϋϥε໊͸StudlyCapsʢ୯ޠͷઌ಄ΛେจࣈͰॻ͘ه๏ʣ
    • ϝιου໊͸camelCaseʢઌ಄͸খจࣈʣ
    ৄ͘͠͸ ΠϯϑΟχοτϧʔϓ͞Μͷٕज़ϒϩά PSR-1 جຊίʔσΟϯάن໿ʢ೔ຊޠʣ
    → http://www.infiniteloop.co.jp/docs/psr/psr-1-basic-coding-standard.html

    View Slide

  18. PSR-2
    ίʔσΟϯάελΠϧΨΠυ
    • PHPίʔυͷॻࣜΛ౷Ұͯ͠ೝࣝͷᴥᴪΛ๷
    ͙ͨΊʹඞཁͱ͞ΕΔίʔσΟϯάελΠϧ
    ΨΠυɻ
    • PSR-1ʹ४ڌ͢Δඞཁ͕͋Δɻ

    View Slide

  19. PSR-2
    ίʔσΟϯάελΠϧΨΠυ
    • Πϯσϯτ͸εϖʔε4ͭʢλϒ͸μϝʣ
    • ໊લۭؒͷ͋ͱ͸1ߦۭ͚ΔʢuseϒϩοΫޙ
    ΋ಉ༷ʹۭ͚Δʣ
    ৄ͘͠͸ ΠϯϑΟχοτϧʔϓ͞Μͷٕज़ϒϩά PSR-1 جຊίʔσΟϯάن໿ʢ೔ຊޠʣ
    → http://www.infiniteloop.co.jp/docs/psr/psr-1-basic-coding-standard.html

    View Slide

  20. View Slide

  21. PSR-3

    View Slide

  22. PSR-3
    Logger Interface
    • PSRͰॳΊͯঝೝ͞ΕͨΠϯλʔϑΣʔε
    • ໨ඪ͸FW΍ϥΠϒϥϦͰར༻͢ΔϩΨʔΛ࣮
    ૷Ͱ͖ΔΑ͏ʹ͢Δ͜ͱ

    View Slide

  23. PSR-3
    Logger Interface
    • Psr\Log\LoggerInterface Λ࣮૷͢Δ
    • RFC 5424 The Syslog Protocol Ͱه͞Ε͍ͯΔ8Ϩϕ
    ϧͷϩάॻ͖ࠐΈ༻ͷϝιου

    - http://tools.ietf.org/html/rfc5424
    • 9ͭ໨ͷϩάॻ͖ࠐΈ༻ϝιουͱͳΔlogϝιου
    • ֦ுͯ͠΋Α͍͕ɺPSR-3ͱޓ׵ੑΛอͭඞཁ͕͋Δɻ

    View Slide

  24. PSR-3
    Logger Interface
    • PSR-3ʹ४ڌͨ͠୅දతͳϥΠϒϥϦ
    • Monolog
    • ࠷ۙͷFW͸MonologΛ౷߹ͯ͠Δࣄ͕ଟ͍ͷ
    ͰɺPSR-3४ڌͷϩΨʔʹࠩ͠ସ͑ͨΓɺ༻్
    ʹԠ֦ͯ͡ுͨ͠Γ͢Δ͜ͱ΋Մೳɻ

    View Slide

  25. PSR-6

    View Slide

  26. PSR-6
    Caching Interface
    • ։ൃऀ͕طଘͷFW΍γεςϜʹΩϟογϡϥ
    ΠϒϥϦΛ౷߹Ͱ͖ΔΑ͏ʹ͢Δ
    • ࣮૷ʹ͸ϓʔϧͱΞΠςϜ͕ॏཁͳཁૉͱͳ
    Δ

    View Slide

  27. PSR-6
    Caching Interface
    • Psr\Cache\CacheItemInterface
    • ΩϟογϡͷΞΠςϜͦͷ΋ͷ
    • ஋ͱ༗ޮظݶ͕ηοτ͞ΕΔ
    • Psr\Cache\CacheItemPoolInterface
    • ΞΠςϜΛ؅ཧ͢ΔʢΞΠςϜΛੜ੒ͷ੹຿͕͋Δʣ
    • ΞΠςϜΛอଘɾऔಘɾ࡟আͰ͖Δ

    View Slide

  28. PSR-7

    View Slide

  29. PSR-7
    HTTP message interfaces
    • Web։ൃͷج൫ͱͳΔHTTPϝοηʔδͷΠϯ
    λʔϑΣʔεΛఏڙ
    • HTTP is Simple 

    - http://symfony.com/doc/current/book/http_fundamentals.html#http-is-simple

    View Slide

  30. PSR-7
    HTTP message interfaces
    • Psr\Http\Message\MessageInterface
    • ϓϩτίϧόʔδϣϯɺϔομɺϘσΟ
    • Psr\Http\Message\RequestInterface
    • HTTPϝιουɺURI
    • Psr\Http\Message\ServerRequestInterface
    • εʔύʔάϩʔόϧม਺ͷαʔόɺΫοΩʔɺΫΤϦจࣈྻɺϑΝΠϧɺϘσΟͱଐੑ
    • Psr\Http\Message\ResponseInterface
    • εςʔλείʔυͱReason-Phraseɻ͍ΘΏΔεςʔλεߦɻ
    • ଞʹ StreamInterfaceɺUriInterfaceɺUploadedFileInterface ͕४උ͞Ε͍ͯ·͢ɻ

    View Slide

  31. PSR-7
    HTTP message interfaces
    • ෆมΦϒδΣΫτʢImmutableʣ

    - http://qiita.com/asaokamei/items/b86e384867bcf0379cea
    • ྫ͑͹ϦΫΤετΦϒδΣΫτ͕ॲཧதʹม
    ߋ͞ΕΔ͜ͱ͸ෆࣗવɻ
    • ༧૝֎ͷมߋʹΑΔ໰୊Λະવʹ๷͕ΕΔɻ

    View Slide

  32. ࠓͷͱ͜Ζ஌͓ͬͯ͘ͱ͍͍
    ͔ͳతͳঝೝࡁΈͷPSR 6ͭ
    Λ͝঺հ͠·ͨ͠

    View Slide

  33. PSR-12
    ίʔσΟϯάελΠϧΨΠυվ
    • PSR-2Λ֦ு͠ɺஔ͖׵͑Δ
    • ໾ׂ͸PSR-2ಉ༷ϝϯόʔؒͷೝࣝͷᴥᴪΛ๷
    ͙ͨΊͷίʔσΟϯάελΠϧΨΠυ
    • PSR-1ʹ४ڌ͢Δඞཁ͕͋Δ
    • ૲Ҋ͕͍ͩۙ͏ͪʹঝೝ͞ΕΔʢͱࢥ͏ʣ

    View Slide

  34. PSR-12
    ίʔσΟϯάελΠϧΨΠυվ
    declare(strict_types=1);
    namespace Vendor\Package;
    use Vendor\Package\{ClassA as A, ClassB, ClassC as C};
    use Vendor\Package\Namespace\ClassD as D;
    use function Vendor\Package\{functionA, functionB, functionC};
    use const Vendor\Package\{ConstantA, ConstantB, ConstantC};
    class Foo extends Bar implements FooInterface
    {

    View Slide

  35. PSR-12
    ίʔσΟϯάελΠϧΨΠυվ
    class Foo extends Bar implements FooInterface
    {
    public function sampleFunction(int $a, int $b = null): array
    {
    if ($a === $b) {
    bar();
    } elseif ($a > $b) {
    $foo->bar($arg1);
    } else {
    BazClass::bar($arg2, $arg3);
    }
    }
    final public static function bar()
    {
    // method body
    }
    }

    View Slide

  36. PSR-12
    ίʔσΟϯάελΠϧΨΠυվ
    class Foo extends Bar implements FooInterface
    {
    public function sampleFunction(int $a, int $b = null): array
    {
    if ($a === $b) {
    bar();
    } elseif ($a > $b) {
    $foo->bar($arg1);
    } else {
    BazClass::bar($arg2, $arg3);
    }
    }
    final public static function bar()
    {
    // method body
    }
    }

    View Slide

  37. PSR-12
    ίʔσΟϯάελΠϧΨΠυվ
    • PSR-12 Extended Coding Style Guide

    - https://github.com/php-fig/fig-standards/blob/master/proposed/extended-coding-
    style-guide.md
    • declare

    - http://php.net/manual/ja/control-structures.declare.php
    • ڧ͍ܕ෇͚

    - http://php.net/manual/ja/functions.arguments.php#functions.arguments.type-
    declaration.strict
    • TypeError

    - http://php.net/manual/ja/class.typeerror.php

    View Slide

  38. ·ͱΊ

    View Slide

  39. PSR͸
    ҰൠతͳίʔσΟϯάن໿ͷΈͳΒͣ
    ΠϯλʔϑΣʔε΍ηΩϡϦςΟͱ͍ͬ
    ͨ։ൃͱ͍͏࿮૊ΈΛඪ४Խ͢Δ͜ͱ
    ʹΑͬͯɺಛఆͷϓϩδΣΫτͷϧʔ
    ϧʹґଘ͠ͳ͍ίϯϙʔωϯτϕʔε
    ͷ։ൃ΍ηΩϡΞͰ඼࣭ͷߴ͍ίʔσΟ
    ϯάʹूத͢ΔͨΊʹՁ஋ͷ͋Δඪ४
    קࠂͩͱײ͡·ͨ͠ɻ

    View Slide

  40. ͝ਗ਼ௌ
    ͋Γ͕ͱ͏
    ͍͟͝·ͨ͠

    View Slide