Slide 1

Slide 1 text

Trait ͱ͸? ͦͷ࢖͍ಓΛߟ͑ͯΈΔ ౻ଜ ୓໵ @tlync 12೥8݄9೔໦༵೔

Slide 2

Slide 2 text

ࣗݾ঺հ 12೥8݄9೔໦༵೔

Slide 3

Slide 3 text

ࣗݾ঺հ • ౻ଜ ୓໵@tlync • ΞϓϦέʔγϣϯ։ൃୈೋ • ࠷ۙͷؔ৺ࣄ • Scala, Agile(Project Mgt.) • PHP ͸ੜ͖Δҝʹ΍͍ͬͯ·͢ 12೥8݄9೔໦༵೔

Slide 4

Slide 4 text

※ ͪͳΈʹ࢒೦ͳ͕Β? PHP ͷ Trait ͷ͓࿩͠Ͱ͢ 12೥8݄9೔໦༵೔

Slide 5

Slide 5 text

Trait Λ஌ͬͯΔਓ? 12೥8݄9೔໦༵೔

Slide 6

Slide 6 text

Trait Λઆ໌Ͱ͖Δਓ? 12೥8݄9೔໦༵೔

Slide 7

Slide 7 text

USBJUUSÉJUcUSÉJ ໊ɹࢺ⽣ܗࣜత⽤ ʢੑ֨श׳ͷʣಛ௃ ಛ৭ ಛ࣭ BENJSBCMFUSBJUTMJLFIPOFTUZBOEDPVSBHFʛ੣࣮͞΍༐ؾͱ ͍ͬͨ͢͹Β͍͠ಛ࣭ "NFSJDBOUSBJUTʛถࠃࠃຽੑ ⽣ر༻ޠ⽤ʢϖϯԖචͳͲͷʣҰච ච࢖͍ʀʢੑ࣭ͳͲ ͷʣؾຯ ؾ഑⽣PG⽤ BUSBJUPGTBEOFTTʛҰ·ͭͷ൵ѩ 12೥8݄9೔໦༵೔

Slide 8

Slide 8 text

ಛ௃ ಛ৭ ಛ࣭ 12೥8݄9೔໦༵೔

Slide 9

Slide 9 text

Trait ͱ͸? • ϝιουͱϓϩύςΟͷू߹ • ୯Ұܧঝͷ੍໿Λܰݮ͢Δ • ܧঝؔ܎ͱ͸ؔ܎ͳ͘ɺڞ௨ͷಛੑɺ ৼ෣͍Λ࠶ར༻(ਫฏల։)Ͱ͖Δ • ͦΕࣗମͰ͸ΠϯελϯεԽͰ͖ͳ͍ 12೥8݄9೔໦༵೔

Slide 10

Slide 10 text

ܧঝؔ܎ͱؔ܎ͳ͘ ࣮૷ Λ ࠶ར༻ Ͱ͖Δ࢓૊Έ 12೥8݄9೔໦༵೔

Slide 11

Slide 11 text

PHP 5.4 <= 12೥8݄9೔໦༵೔

Slide 12

Slide 12 text

ଞݴޠͰͷྨࣅͷػߏ • Scala … trait • Perl 6 … role • Ruby … Mix-in ※ಉ༷ͷ֓೦͕ͩ࢓༷͸ඍົʹҟͳΔɻ ܕ৘ใΛ͔࣋ͭ(is_aΛύε͢Δ͔)ͱ͔ɻ 12೥8݄9೔໦༵೔

Slide 13

Slide 13 text

؆୯ͳαϯϓϧ 12೥8݄9೔໦༵೔

Slide 14

Slide 14 text

trait Engine { public function startEngine() { echo 'BRRRM!'; } } class Car { use Engine; } (new Car)->startEngine(); // BRRRM! 12೥8݄9೔໦༵೔

Slide 15

Slide 15 text

͜Ε͸ܧঝͰ΋ Ͱ͖ͳ͘͸ͳ͍ 12೥8݄9೔໦༵೔

Slide 16

Slide 16 text

Ͱ͸ɺ͜Ε͸? 12೥8݄9೔໦༵೔

Slide 17

Slide 17 text

class Vehicle { protected function startEngine() { echo '⚡'; } } class Plane extends Vehicle { public function fly() { echo '✈'; } } class Boat extends Vehicle { public function sail() { echo '⚓'; } } 12೥8݄9೔໦༵೔

Slide 18

Slide 18 text

class SeaPlane extends ??? { // Ϙʔτͯ͠૸Β͍ͤͨ͠ɺඈߦػ ͱͯ͠ඈ͹͍ͨ͠ɻͲ͏͢Ε͹… } 12೥8݄9೔໦༵೔

Slide 19

Slide 19 text

startEngine() Vehicle sail() Boat fly() Plane sail() fly() SeaPlane ??? 12೥8݄9೔໦༵೔

Slide 20

Slide 20 text

ଟॏܧঝ͸Ͱ͖ͳ͍ 12೥8݄9೔໦༵೔

Slide 21

Slide 21 text

ҕৡ(Composition) ? 12೥8݄9೔໦༵೔

Slide 22

Slide 22 text

interface Plane { public function fly(); } interface Boat { public function sail(); } 12೥8݄9೔໦༵೔

Slide 23

Slide 23 text

class SimplePlane extends Vehicle implements Plane { public function fly() { echo '✈'; } } class SimpleBoat extends Vehicle implements Boat { public function sail() { echo '⚓'; } } 12೥8݄9೔໦༵೔

Slide 24

Slide 24 text

class SeaPlane extends Vehicle implements Plane, Boat { private $boat; private $plane; public function __constract() { $this->boat = new SimpleBoat(); $this->plane = new SimplePlane(); } public function sail() { return $this->boat->sail(); } public function fly() { return $this->plane->fly(); } } $seaPlane = new SeaPlane(); $seaPlane->sail(); // ! $seaPlane->fly(); // ✈ 12೥8݄9೔໦༵೔

Slide 25

Slide 25 text

ܗࣜతͳهड़͕ଟ͍ ΍΍໘౗ 12೥8݄9೔໦༵೔

Slide 26

Slide 26 text

Trait Ͱ ࣮૷ͷڞ༗Λͯ͠ΈΔ 12೥8݄9೔໦༵೔

Slide 27

Slide 27 text

// ໋໊͸ͪΐͬͱඍົ trait FlyEngine { public function fly() { echo '✈'; } } trait FloatEngine { public function sail() { echo '⚓'; } } class SeaPlane implements Plane, Boat // ܕͷܧঝ { use FloatEngine, FlyEngine; // ࣮૷ͷܧঝ } $seaPlane = new SeaPlane(); $seaPlane->sail(); // ! $seaPlane->fly(); // ✈ 12೥8݄9೔໦༵೔

Slide 28

Slide 28 text

هड़͸͖ͬ͢Γ ࣮૷ͷڞ༗͕Ͱ͖ͨ 12೥8݄9೔໦༵೔

Slide 29

Slide 29 text

startEngine() Vehicle sail() Boat fly() Plane sail() fly() SeaPlane sail() BoatEngine fly() FlyEngine sail() BoatEngine fly() FlyEngine 12೥8݄9೔໦༵೔

Slide 30

Slide 30 text

ܕͷอূ … Interface ࣮૷ͷ࠶ར༻ … trait ※ ஫: Scala, Ruby ͳͲͰ͸·ͨͪΐͬͱҧ͏Α! 12೥8݄9೔໦༵೔

Slide 31

Slide 31 text

Trait ͸ ܧঝπϦʔʹؔ܎ͳ͘ ࣮૷ͷ࠶ར༻Λߦ͏͚ͩ 12೥8݄9೔໦༵೔

Slide 32

Slide 32 text

Ͱɺ࣮ࡍͲ͏࢖͏ͱศརͳͷ͔? 12೥8݄9೔໦༵೔

Slide 33

Slide 33 text

1. ந৅ΫϥεΛ࡞Δલʹ Trait ͷݕ౼ 12೥8݄9೔໦༵೔

Slide 34

Slide 34 text

ந৅Ϋϥεͷओͳཧ༝͸ ίʔυͷ࠶ར༻(ଟ෼) 12೥8݄9೔໦༵೔

Slide 35

Slide 35 text

Trait ͕ར༻Ͱ͖ͳ͍͔ݕ౼͢Δ 12೥8݄9೔໦༵೔

Slide 36

Slide 36 text

※Trait த2පʹ͸஫ҙ͠·͠ΐ͏ 12೥8݄9೔໦༵೔

Slide 37

Slide 37 text

2. Entity ͷৼ෣͍ͷڞ༗ 12೥8݄9೔໦༵೔

Slide 38

Slide 38 text

Entity ͷৼ෣͍ • λΠϜελϯϓ؅ཧ • มߋͷτϨʔε • ιϑτσϦʔτՄೳ͔ • ͳͲ… 12೥8݄9೔໦༵೔

Slide 39

Slide 39 text

trait Timestampable { private $createdAt; private $updatedAt; ... getter, setter /** * Updates createdAt and updatedAt timestamps. */ public function updateTimestamps() { if (null === $this->createdAt) { $this->createdAt = new \DateTime('now'); } $this->updatedAt = new \DateTime('now'); } } 12೥8݄9೔໦༵೔

Slide 40

Slide 40 text

/** * ঎඼ΤϯςΟςΟ */ class Product { use Timestampable, // λΠϜελϯϓΛࣗಈͰ SoftDeletable, // ιϑτσϦʔτՄೳʹ Activatable; // ׆ੑɺඇ׆ੑΛՄೳʹ private $name; // ຊ࣭తͳϩδοΫ } 12೥8݄9೔໦༵೔

Slide 41

Slide 41 text

3 12೥8݄9೔໦༵೔

Slide 42

Slide 42 text

࣌ؒͳ͔ͬͨ ʘ(^o^)ʗ 12೥8݄9೔໦༵೔

Slide 43

Slide 43 text

͍͍ΞΠσΟΞ͋ͬͨΒ ڭ͍͑ͯͩ͘͞ 12೥8݄9೔໦༵೔

Slide 44

Slide 44 text

·ͱΊ 12೥8݄9೔໦༵೔

Slide 45

Slide 45 text

Trait Λ஌ΓɺPHP 5.4 ࣌୅ͷ ৽ͨͳઃܭΛ୳Ζ͏ 12೥8݄9೔໦༵೔

Slide 46

Slide 46 text

ͦΕ͔ 12೥8݄9೔໦༵೔

Slide 47

Slide 47 text

͜ͷձ͔ࣾΒ PHP Λ๾໓͠Α͏ 12೥8݄9೔໦༵೔

Slide 48

Slide 48 text

͓ΘΓ 12೥8݄9೔໦༵೔