Slide 1

Slide 1 text

!%2/&0 Ͳ͖ΎͶ͓ BU.FSDBSJ QIQTUVEZ lTFMGzJO 3FUVSO5ZQF%FDMBSBUJPO

Slide 2

Slide 2 text

(JUຊͷ؂म͠·ͨ͠

Slide 3

Slide 3 text

3FUVSOUZQFEFDMBSBUJPO ໭Γ஋ͷܕએݴ ࢖ͬͯ·͔͢ʁ

Slide 4

Slide 4 text

function foo(): int { } ໭Γ஋ͷܕએݴͱ͸ʁ ͜Μͳ΍ͭ

Slide 5

Slide 5 text

ྫɿࣗ෼Λฦ͢ϝιου class A { public function getMe(): A { return $this; } }

Slide 6

Slide 6 text

࣮͸TFMGͱॻ͚Δ class A { public function getMe(): self { return $this; } }

Slide 7

Slide 7 text

΂ΜΓʂʂ

Slide 8

Slide 8 text

ҙ֎ͱ஌Βͳ͍ਓ ଟ͍ҹ৅

Slide 9

Slide 9 text

ެࣜυΩϡϝϯτʹ͸ ͳ͔ͥTFMGʹ͍ͭͯ ݴٴͳ͠ IUUQQIQOFUNBOVBMFOGVODUJPOTSFUVSOJOH WBMVFTQIQGVODUJPOTSFUVSOJOHWBMVFTUZQFEFDMBSBUJPO

Slide 10

Slide 10 text

3'$ͷԼͷํʹখ͞ʙ͘ ॻ͍ͯ͋Δ IUUQTXJLJQIQOFUSGDSFUVSO@UZQFT

Slide 11

Slide 11 text

ܧঝ͢ΔͱͲ͏ͳΔʁ class A { public function getMe(): self { return $this; } } class B extends A {} $b = new B(); $b->getMe(); // ?

Slide 12

Slide 12 text

ਖ਼ղ#ͷΠϯελϯε͕ฦΔ class A { public function getMe(): self { return $this; } } class B extends A {} $b = new B(); $b->getMe(); // instance of B

Slide 13

Slide 13 text

UIJT͸ɺ#ͷίϯςΩε τ͔Βݺ͹ΕΔͱ#ͷΠ ϯελϯεΛࢦ͢ͷͰɻ

Slide 14

Slide 14 text

ࠨͷίʔυ͸ӈͷίʔυͱ౳Ձ class A { public function getMe(): A { return $this; } } class B extends A {} $b = new B(); $b->getMe(); // B class A { public function getMe(): self { return $this; } } class B extends A {} $b = new B(); $b->getMe(); // B

Slide 15

Slide 15 text

໭Γ஋ͷܕ͸ɺ ࣮ߦ࣌ʹSFUVSO͞Εͨࡍʹ JOTUBODFPG తͳ΋ͷͰ ͰνΣοΫ͞ΕΔ

Slide 16

Slide 16 text

͜ͷ৔߹Ͳ͏ͳΔʁ class A { public function getMe(): self { return $this; } } class B extends A { public function getMe(): self { return $this; } }

Slide 17

Slide 17 text

'BUBMFSSPS
 ࣮ߦ࣌ίϯύΠϧΤϥʔ 1)1'BUBMFSSPS %FDMBSBUJPOPG#HFU.F #NVTUCFDPNQBUJCMFXJUI "HFU.F "

Slide 18

Slide 18 text

͜Ε͕μϝͳͷͱಉ͡
 γάωνϟͷෆҰக class A { public function getMe(): A … } class B extends A { public function getMe(): B … }

Slide 19

Slide 19 text

͜͏͢Ε͹͓̺ class A { public function getMe(): self { return $this; } } class B extends A { public function getMe(): parent { return $this; } }

Slide 20

Slide 20 text

͜Ε͕0,ͳͷͱಉ͡ class A { public function getMe(): A … } class B extends A { public function getMe(): A … }

Slide 21

Slide 21 text

༨ஊɿ͜Ε͸কདྷͷ1)1Ͱ͸ ՄೳʹͳΔ͔΋͠Εͳ͍ɻ ໭Γ஋ͷڞม class A { public function getMe(): A } class B extends A { public function getMe(): B … } IUUQTXJLJQIQOFUSGDDPWBSJBOUSFUVSOTBOE DPOUSBWBSJBOUQBSBNFUFST

Slide 22

Slide 22 text

ͪͳΈʹܕ໊ͷͱ͜Ζʹ TUBUJD͸ෆՄɻ class A { public function getMe(): static … }

Slide 23

Slide 23 text

·ͱΊ w ໭Γ஋ܕએݴͰTFMG QBSFOU ͕࢖͑Δ w ཚ༻͢ΔͱΘ͔Γʹ͘͘ͳΔ ͷͰదࡐదॴͰ w ʮJOTUBODFPGνΣοΫʯͩͱ ࢥ͑͹͓̺

Slide 24

Slide 24 text

༨ஊɿϝιουͷҾ਺Ͱ΋࢖͑Δ class A { public function setMe(self $self) { $this->self = $self; } } class B extends A { public function setMe(parent $self) { $this->self = $self; } }

Slide 25

Slide 25 text

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