Slide 1

Slide 1 text

ۃΊΔʂ
 ϝιουνΣʔϯ @hiraku

Slide 2

Slide 2 text

ࣗݾ঺հ • த໺ ୓ (@Hiraku) • https://github.com/hirak • ϝϧΧϦͷαʔόʔαΠυΤϯδχΞ • Composerؔ࿈ͷൃදΛΑ͍ͯ͘͠·͢ • PHPΧϯϑΝϨϯεؔ੢2016 جௐߨԋ

Slide 3

Slide 3 text

We are hiring!

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

ۃΊΔʂ
 ϝιουνΣʔϯ @hiraku

Slide 8

Slide 8 text

ϝιουνΣʔϯͱ͸ $talk ->setTitle('art of method chain') ->setContent('no plan') ->setLength('20min') ; ΦϒδΣΫτʹରͯ͠ɺ
 ϝιουΛଓ͚ͯॻ͚ΔΑ͏ʹ
 ͨ͠ύλʔϯ/APIσβΠϯͷ͜ͱ

Slide 9

Slide 9 text

5೥લʹൃදͨ͠΍ͭ https://www.slideshare.net/hinakano/xml-builder

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

΋ͪΖΜ߹๏ͳPHPߏจ

Slide 12

Slide 12 text

Χοίলུ&Մมϝιου໊ ด͡λά͕ͳ͍͜ͱͷ໌ࣔ ด͡λάิ׬

Slide 13

Slide 13 text

࠷ۙॻ͍ͨ΍ͭ PHPͷߴ଎ΦγϟϨةݥ഑ྻϥΠϒϥϦspindle/collectionΛ࡞͍ͬͯΔ࿩ - Qiita http://qiita.com/Hiraku/items/bb6318d1d2c26ae7f30a

Slide 14

Slide 14 text

·ΔͰ੒௕ͯ͠ͳ͍…

Slide 15

Slide 15 text

ϝιουνΣʔϯେ޷͖ • ੍໿಺ͰPHPΒ͘͠ͳ͍ߏจΛ࡞Δ௅ઓ • PHP͸ߏจ͕ශऑͩͬͨ • ݺͼग़͠νΣʔϯͰ͖ͳ͍ͱ͔()()()() • །Ұੲ͔Β࢖͑ͨͷ͕ϝιουνΣʔϯ

Slide 16

Slide 16 text

͓͜ͱΘΓ • ϥΠϒϥϦΛఏڙ͢Δਓ͸ԿΛߟ͑Δ΂͖͔ʁ Έ͍ͨͳ࿩Λ͠·͢ • ҰੲલͷJavaͷম͖௚͔͠΋͠Εͳ͍

Slide 17

Slide 17 text

໨࣍ 1. σϝςϧͷ๏ଇ 2. ϝιουνΣʔϯͷύλʔϯ৭ʑ 3. APIσβΠϯͷ͓࿩ 4. σϞతͳ΍ͭ

Slide 18

Slide 18 text

1ষ
 σϝςϧͷ๏ଇ ۃΊΔ!ϝιουνΣʔϯ

Slide 19

Slide 19 text

σϝςϧͷ๏ଇ (࠷খ஌ࣝͷݪଇ)
 (Law of Demeter, LoD) • ιϑτ΢ΣΞͷઃܭɺಛʹΦϒδΣΫτࢦ޲ ϓϩάϥϜͷઃܭʹ͓͚ΔΨΠυϥΠϯ • ʮ๏ଇʯͱ͍͏࿨༁͕ͩɺʮ͜ΕΛकͬͯΔ ίʔυͷํ͕͍͍Αʂʯͱ͍͏Α͏ͳओࢫ

Slide 20

Slide 20 text

σϝςϧOK? 0, /( B BCD UIJTB UIJTB C UIJTBC UIJTBC D

Slide 21

Slide 21 text

৮ͬͯྑ͍΋ͷ 0, ϩʔΧϧม਺ɺҾ਺͸৮ͬͯ0, B ࣗ෼ͷϝιου͸৮ͬͯ0, UIJTB ࣗ෼ͷϓϩύςΟͷϝιου΋ ৮ͬͯ0, UIJTBC

Slide 22

Slide 22 text

$talk ->setTitle('art of method chain') ->setContent('no plan') ->setLength('20min') ; $talk->setTitle('art of method chain'); $talk->setContent('no plan'); $talk->setLength('20min'); LoD͸कͬͨํ͕͍͍ͷʁ ϝιουͷ໭Γ஋ is Կʁ ͜ΕͳΒ໭Γ஋Λؾʹ͢Δ·Ͱ΋ͳ͍

Slide 23

Slide 23 text

ϝιουνΣʔϯͱ͸ $talk ->setTitle('art of method chain') ->setContent('no plan') ->setLength('20min') ; ΦϒδΣΫτʹରͯ͠ɺ
 ϝιουΛଓ͚ͯॻ͚ΔΑ͏ʹ
 ͨ͠ύλʔϯ/APIσβΠϯͷ͜ͱ

Slide 24

Slide 24 text

͸͍

Slide 25

Slide 25 text

ϝιουνΣʔϯ͸LoDҧ൓ • LoDతʹ͸ɺ$this->set...; $this->set...; ͱͦΕ ͧΕॻ͘΂͖ • LoD΋ɺϥΠϒϥϦઃܭऀ͕஌͓ͬͯ͘΂͖
 ݪଇͷ̍ͭͰ͸͋Δ

Slide 26

Slide 26 text

Ұ୴ɺLoD͸ஔ͍ͱ͍ͯɺ
 ࿩ΛਐΊ·͢ɻ

Slide 27

Slide 27 text

2ষ
 ϝιουνΣʔϯͷ
 ύλʔϯ ۃΊΔ!ϝιουνΣʔϯ

Slide 28

Slide 28 text

LoDΛഁͬͯ·Ͱ ϝιουνΣʔϯͰ ԿΛ͍ͨ͠ͷ͔ʁ

Slide 29

Slide 29 text

1) return $this class Chainable { function setA($val) { $this->a = $val; return $this; } function setB($val) { $this->b = $val; return $this; } } (new Chainable) ->setA('a') ->setB('b'); ࿈ଓͰsetͰ͖ΔΑ͏ʹͳͬͨΑʂ

Slide 30

Slide 30 text

return $this
 ʹର͢Δݸਓతཧղ • ౎౓$instance->ͬͯॻ͔ͳͯ͘Α͘ͳΔ • ͪΐͬͱ͚ͩShort hand • ͨͩͦΕ͚ͩͳͷͰɺLoDഁΔ΄ͲͷՁ஋͕ ͋Δ͔…ͱ͍͏ͱඍົͳؾ΋͢Δ

Slide 31

Slide 31 text

2) PSR-7ͷAPIΈ͍ͨͳ΍ͭ (new GuzzleHttp\Psr7\Request('GET', 'http://example.com')) ->withHeader('foo', 'baa') ->withBody($body); return $thisͰ͸ͳ͘ɺ
 newͯ͠ࠓ·Ͱͷ৘ใΛίϐʔ
 (ผΠϯελϯεΛฦ͢)

Slide 32

Slide 32 text

immutableͱ͸ • setterͷͳ͍ΦϒδΣΫτ • ಺෦ΛมߋͰ͖ͳ͍ͷͰɺ
 clone͠ͳͯ͘΋҆શʹฦͤΔ • setterͰ͸ͳ͘ɺʮίϐʔͯ͠Ұ෦Λ্ॻ͖ʯ ͢ΔσβΠϯ

Slide 33

Slide 33 text

immutable
 ʹର͢Δݸਓతཧղ • ໭Γ஋Λड͚औΒͳ͍ͱ݁Ռ͕ফ͑ͯ͠·͏ • $obj->setFoo($foo);
 $obj->setBaa($baa);
 ͯ͠΋ҙຯ͕ͳ͍ • $obj = $obj->setFoo($foo);
 $obj = $obj->setBaa($baa); • ه๏͕໘౗ͳͷͰɺϝιουνΣʔϯʹͨ͘͠ͳΔ(Θ͔Δ)

Slide 34

Slide 34 text

ͪΐͬͱ࿩͕ҳΕ·͕ͨ͠ • return $this͢Δ͚͕ͩϝιουνΣʔϯͰ͸ ͳ͍ • return new ͢Δύλʔϯ΋͋Δ

Slide 35

Slide 35 text

return newͰ
 ༡ΜͰΈΔྫ

Slide 36

Slide 36 text

͓୊ • ϝιουνΣʔϯͰ
 ೖΕࢠͰ͖ΔifจΛ
 ࡞Ε

Slide 37

Slide 37 text

ϒϩοΫʹΦϒδΣΫτΛ౰ͯ ͸ΊΔ • if͸newΛฦ͢ • endif͸ϒϩοΫΛ ऴΘΒͤͯ΋ͱʹ ໭Δ

Slide 38

Slide 38 text

parent = $parent; } abstract function if(bool $bool): Context; abstract function say(string $str): Context; function endif(): Context { return $this->parent; } } class TrueContext extends Context { function if(bool $bool): Context { if ($bool) { return new self($this); } else { return new FalseContext($this); } } function say(string $str): Context { echo $str,PHP_EOL; return $this; } } class FalseContext extends Context { function if(bool $bool): Context { return new self($this); } function say(string $str): Context { return $this; } } function dsl(): TrueContext { return new TrueContext; } ͍͍ͩͨ ͜Ε͙Β͍ Ͱ࡞ΕΔ ϝιουνΣʔϯDSLͰϒϩοΫΛ࡞ΔςΫχοΫ: Architect Note http://blog.tojiru.net/article/272060766.html

Slide 39

Slide 39 text

3) +ϚδοΫϝιουͷཚ༻ return $thisͰ͸ͳ͘ɺ
 newͯ͠ࠓ·Ͱͷ৘ใΛίϐʔ
 (ผΠϯελϯεΛฦ͢)

Slide 40

Slide 40 text

ϚδοΫϝιου • __get(){}ɺ__call(){}ΛΫϥεʹੜ΍͓ͯ͘͠ • ϓϩύςΟ/ϝιουʹΞΫηεग़དྷͳ͍ͱ͖ ʹࣗಈతʹݺ͹ΕΔ • Rubyͷmethod_missingΈ͍ͨͳ΍ͭ

Slide 41

Slide 41 text

IUNM NFUB@ UJUMF@ @ ͳΜͯϝιου΍
 QVCMJDϓϩύςΟ͸ੜ͍͑ͯͳ͍ɻ ࣮ࡍʹॲཧ͍ͯ͠Δͷ͸ @@DBMM ͱ@@HFU

Slide 42

Slide 42 text

ϚδοΫϝιου • ✅ίʔυྔ(ܶతʹݮΔ) • ❌ಡΈ΍͢͞ • ❌֦ுੑ • ❌PhpStormʹౖΒΕΔ • ׂͱݏ͍ͬͯΔPHPer͕ଟ͍ҹ৅(ओ؍)

Slide 43

Slide 43 text

4) fluent interface • ʮྲྀΕΔΑ͏ͳΠϯλʔϑΣʔεʯ • ϝιουνΣʔϯΛ΋͏গ͠ൃలͤͨ͞΋ͷ • આ໌͕೉͍͠ͷͰ࣍ͷষ΁

Slide 44

Slide 44 text

3ষ
 APIσβΠϯͷ࿩ ۃΊΔ!ϝιουνΣʔϯ

Slide 45

Slide 45 text

ঢ়گ • ͋ͳͨ͸ɺͱ͋ΔWebαʔϏεͷPHP൛SDK Λ࡞Δ͜ͱʹͳΓ·ͨ͠ • ͦͷWebαʔϏε͸େྔͷػೳ͕͋Γ·͢ɻ • SDKͳͷͰɺੜcurlͰୟ͘ΑΓ͸ศརʹ͍ͨ͠

Slide 46

Slide 46 text

No content

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

SDKͷAPIσβΠϯ • SDKϢʔβʔ͸಺෦࣮૷ΛΑ͘஌Βͳ͍ • Ͱ͖Ε͹υΩϡϝϯτ͚ͩͰ࢖͍͜ͳ͍ͨ͠ • ͲΜͳΫϥε͕͋ͬͯɺ
 ͲΜͳϝιουΛ഑ஔ͢Δʁ

Slide 49

Slide 49 text

…Ԟͷਂ͍࿩Ͱ͋Δ

Slide 50

Slide 50 text

ςϨϏͷϦϞίϯ໰୊

Slide 51

Slide 51 text

No content

Slide 52

Slide 52 text

Α͋͘ΔςϨϏͷϦϞίϯ • Ϙλϯ͕͍ͬͺ͍͋Δ • ͲΕΛԡͤ͹͍͍ͷʁ໎͏ • (ͨͿΜ)ςετେมͦ͏… • ͍ͭͰ΋͋ΒΏΔϘλϯ͕ԡͤΔ

Slide 53

Slide 53 text

ղܾҊ • ͍͞͠ΐ͸Ϙλϯ1ݸ(ిݯ)ͷΈ • ిݯ͕ೖΔͱɺ͏ʹΐʔΜͱϘλϯ͕ੜ͑ͯ͘Δ • ૢ࡞͢ΔͨͼʹɺϘλϯ͕͏ʹΐʔΜͱੜ͑ͯ͘ Δ or ফ͑Δ • Ϙλϯ͸ݮΒͤͦ͏Ͱ͢Ͷʂ

Slide 54

Slide 54 text

API = ϦϞίϯ

Slide 55

Slide 55 text

APIσβΠϯʹ౰ͯ͸ΊͯΈΔ • ϩάΠϯ͕ඞཁͳΒɺϩάΠϯͷAPI͚͕ͩ
 ݟ͑ͯΔ΂͖ • ͦͷঢ়ଶͰՄೳͳૢ࡞͚͕ͩ࢖͑Δ • linkͰػೳΛͭͳ͙RESTͷΑ͏ͳߟ͑ํ

Slide 56

Slide 56 text

fluent interfaceͷߟ͑ํ • จ຺(ίϯςΩετ)ʹԠͯ͡ɺreturn͢Δ
 ΫϥεΛมߋ͢Δ • ඞཁे෼ͳϝιου͚ͩ৮ΕΔঢ়ଶΛอͭ

Slide 57

Slide 57 text

4ষ
 SELECTจϏϧμʔ ۃΊΔ!ϝιουνΣʔϯ

Slide 58

Slide 58 text

ΫΤϦϏϧμͬͯ͋Γ·͢ΑͶ • PHP্ͰSQLΛ૊ΈཱͯΔ΍ͭ • ΞϨΛfluent interfaceͰઃܭ(design)ͯ͠
 Έ·͠ΐ͏ • ࣮૷·Ͱ͸ؒʹ߹Θͳ͔ͬͨ

Slide 59

Slide 59 text

SELECTจͷ෮श ͍͍ͩͨҎԼͷॱͰॲཧ͞ΕΔ FROM → JOIN → WHERE → GROUP BY → HAVING → PROJECT → ORDER BY → LIMIT → UNION ࢦఆॱΛ͜ΕͰݻఆͰ͖ΔΑ͏ʹAPIઃܭ

Slide 60

Slide 60 text

ࡉ͔͘ΫϥεΛ༻ҙ

Slide 61

Slide 61 text

໭Γ஋Λ࣍ͷίϯςΩετʹ

Slide 62

Slide 62 text

ͱ͍͏Θ͚Ͱద౰ʹ࡞ͬͨ΍ͭ https://github.com/hirak/php-query-builder (APIσβΠϯͷ࿩ͳͷͰத਎͸ϞοΫঢ়ଶ)

Slide 63

Slide 63 text

Demo

Slide 64

Slide 64 text

fluent interfaceͷ͍͍ͱ͜Ζ • IDEͷิ׬ͱ૊Έ߹ΘͤΔͱޮՌ͸͹͙ͭΜͩ

Slide 65

Slide 65 text

APIઃܭऀͷ಄ͷத • LoDʹै۪ͬͨ௚ͳઃܭʹ͢Δ΂͖͔ʁ • ίϯςΩετΛಋೖͯ͠fluent͗Έʹ͢Δ͔ʁ • ΞϓϦͷUIΛߟ͑Δ͜ͱͱࣅ͍ͯΔ • ਖ਼ղ͸ͳ͍͚Ͳɺ͍Ζ͍Ζͳྲྀ೿Λ஌͓ͬͯ ͘ͱɺ͍͔ͭ໾ཱ͔ͭ΋ʁ

Slide 66

Slide 66 text

·ͱΊ

Slide 67

Slide 67 text

Ԟਂ͖ϝιουνΣʔϯͷੈք • σϝςϧͷ๏ଇ͓͖֮͑ͯ·͠ΐ͏ • ϝιουνΣʔϯͰDSLͬΆ͍΋ͷ࡞Δͱ
 ָ͍͠Α • return $thisҎ֎ʹ΋৭ʑ͋Δͷ͸͓֮͑ͯ͘ ͱ͍͍Α

Slide 68

Slide 68 text

ͦͷଞͷ࿩୊

Slide 69

Slide 69 text

Unified Variable Syntax (PHP7) • PHP7͔ΒɺνΣʔϯͰ͖ΔߏจͷόϦΤʔ γϣϯ͕૿͑ͯΔ • abc()()ɺBaa::a()::foo() • Կ͔࢖͍ํͳ͍͔ͳʔɻɻ