PHPカンファレンス福岡2017の登壇資料です。
PHPͷ Τϥʔͱྫ֎࠶ೖPHPΧϯϑΝϨϯεԬ 2017
View Slide
ࣗݾհ• த (@Hiraku)• https://github.com/hirak• ීஈϝϧΧϦͰαʔόʔαΠυΤϯδχΞ ͬͯ·͢• Composerؔ࿈ͷൃදΛΑ͍ͯ͘͠·͢
ͳΜͰࠓ͞Β ʮΤϥʔͱྫ֎ʯʁ
ྫ֎͕Β͍͠ʂ• 2016ʙ ҰॠQiitaϒϩάͰྫ֎ͷهࣄ͕૿͑ͨ• http://php-genba.shin1x1.com/1• ͨͿΜݯPHPΧϯϑΝϨϯε2016Ͱͷ@t_wada ͞Μͷߨԋ
͔Ϳͬͨ… ʘ(^o^)ʗ
ྫ֎+PHPͷࣄ͕ηογϣϯͰ͢
࣍1. ʮΤϥʔʯͷఆٛ2. ൃੜͱޙ࢝ͷ3. PHPͷΤϥʔͱྫ֎ͷػೳ4. ྫ֎҆શͱΦϒδΣΫτࢦ5. ϙέϞϯ
1ষʮΤϥʔʯͷఆٛ
ྫ: HTTPͰϑΝΠϧऔಘ͢Δؔ• $resp = http_get('http://php.net/')• ࣗલ࣮͢ΔͳΒɺͲΜͳΤϥʔॲཧΛॻ͖·͔͢ʁ
http_get(true);// boolean͕͞ΕͨΜͰ͚͢Ͳʂhttp_get('uso800');// URL͡Όͳ͍ʂhttp_get('http://uso800.example.com/');// !υϝΠϯݟ͔ͭΒͳ͍Αhttp_get('http://heavy.example.com/');// !3࣌ؒͨͬͯऴΘΒͳ͍ΜͰ͕͢
Τϥʔͱ• Կ͔ྑ͘ͳ͍͜ͱ͕ى͖ͨ• ॲཧΛਐΊΒΕͳ͍• ʮॲཧΛதࢭ͢Δʯ• ʮԡ͠௨͢ʯ
http_get(true);// boolean͕͞ΕͨΜͰ͚͢Ͳʂhttp_get('uso800');// URL͡Όͳ͍ʂhttp_get('http://uso800.example.com/');// !υϝΠϯݟ͔ͭΒͳ͍Αhttp_get('http://heavy.example.com/');// !3࣌ؒͨͬͯऴΘΒͳ͍ΜͰ͕͢←ॻ͍͕ͨͭѱ͍ʢόάʣ←Β͍ࣄނ
୭͕ѱ͍͔• ͍ํ͕ؒҧ͍ͬͯΔύλʔϯ• Ͳ͏ͯ͠ൃੜ͠͏Δύλʔϯ (࣮ߦ࣌Τϥʔ)• typoͳͷ͔ʁ ࣮ߦ࣌Τϥʔͳͷ͔ʁ• ͔ؔΒผͰ͖ͳ͍ύλʔϯ
PHPͷཱͰʮΤϥʔʯͱ• PHPࣗମ• ʮιʔείʔυΛड͚औͬͯʯ• ʮ࣮ߦ͢Δʯ• ؔΈ͍ͨͳͷ• PHPʹͱͬͯԿ͔ྑ͘ͳ͍͜ͱ͕ى͖ͨ ʹΤϥʔ
PHPʹͱͬͯྑ͘ͳ͍͜ͱ• มͳιʔείʔυ͕͞Εͨ• ࣮ߦͯ͠ΈͨΒมͳ͜ͱ͕ى͖ͨ
php > "Hello world"Λग़ྗͯ͠Լ͍͞ɻ;PHP Parse error: syntax error, unexpectedidentifier (T_STRING) in php shell code online 1ԿޠͩΑͦΕʂཧղෆೳɺॲཧࢭΊΔͶ
php > echo Hello;PHP Notice: Use of undefined constantHello - assumed 'Hello' in php shell codeon line 1Hello ະఆٛఆ… ͨͿΜ""ΛΕͯΔΜͩͳʂউखʹจࣈྻѻ͍ʹͯ͠Ζ͏ ͨͩͪ͠ΐͬͱո͍͔͠ΒΤϥʔͱͯ͠௨
php > echo [1,2,3];PHP Notice: Array to string conversion inphp shell code on line 1ArrayྻΛecho… ༷ͱͯ͠"Array"ͱग़ྗ ͢Ε͍͍Μ͚ͩͲɺո͍͔͠ΒΤϥʔͱͯ͠௨
PHP͞ΜେมͳͷͰ͢• ίϯύΠϧɺͱ͍͏લॲཧ͕ͳ͍• ͯ͢Λ࣮ߦ࣌ʹॲཧ͠ɺո͚͠Εͱʹ͔͘ΤϥʔΛు͘• ଞͷݴޠͩͱlintίϯύΠϧ࣌warningʹ૬͢Δ෦ʮΤϥʔʯͷൣᙝʹͳΔ
PHPͷΤϥʔ৭ʑ• ߏจ͓͔͍͠ (parse error)• ܕએݴҧ• ͪΐͬͱ͋Γ͑ͳ͍҉ͷܕม• ഇࢭ༧ఆͷؔΛ࣮ߦͨ͠ (deprecated)• ഇࢭ༧ఆͷߏจΛ͍ͬͯΔ (strict)
1ষ ·ͱΊ• PHPιʔείʔυΛͦͷͰ࣮ߦͰ͖ͳ͚Ε͍͚ͳ͍ͷͰɺʮΤϥʔʯͷൣғ͕͍• lintʹ͍ۙ༰ʮΤϥʔʯʹͳΔ
2ষൃੜͱޙ࢝ͷ
࠶ܝ: HTTPͰϑΝΠϧऔಘ͢Δؔ• $resp = http_get('http://php.net/')• ࣗલ࣮͢ΔͳΒɺͲΜͳΤϥʔॲཧΛॻ͖·͔͢ʁ
͠ɺhttp_getؔͷ༷͕• ʮऔಘͰ͖ͳ͔ͬͨΒϦτϥΠ͠ଓ͚Δʯ ͩͬͨΒʁ• URLΛtypoͨ͠Β
͠ɺhttp_getؔͷ༷͕• ʮऔಘͰ͖ͳ͔ͬͨΒۭจࣈΛฦ͢ʯ ͩͬͨΒʁ• ຊʹϨεϙϯε͕ۭจࣈͩͬͨͱ͖ͱݟ͚͕͔ͭͳ͍
͠ɺhttp_getؔͷ༷͕• ʮऔಘͰ͖ͳ͔ͬͨΒϩάʹهͯ͠falseΛฦ͢ʯͩͬͨΒʁ• ϩάͷॻ͖ࠐΈઌͬͯͲ͜Ͱઃఆ͢Δͷʁ
ͳʹ͔ؒҧ͍͑ͯΔͷͰ…
Τϥʔͷޙ࢝ͷಛ• ঢ়گʹΑͬͯมΘΓ͕ͪ• ϦτϥΠ• ϩάʹు͍ͯఘΊΔ (ϑΝΠϧ/ඪ४ग़ྗ)• ผͷؔʹϑΥʔϧόοΫ͢Δ• etc
Τϥʔൃੜͷύλʔϯ• ҧ͏ؔͰಉ͡Τϥʔ͕ى͖Δ͜ͱසग़• ྫ) http_get()ͱhttp_post()ϗετ໊͕ղܾͰ͖ͳ͚Εಉ͡Τϥʔ• ͍͍ͪͪॲཧΛॻ͍ͯͨΒίϐϖͩΒ͚ʹͳΔ
ൃੜͱޙ࢝Λ͠·͠ΐ͏
͠ɺhttp_getؔͷ༷͕• ʮऔಘͰ͖ͳ͔ͬͨΒΤϥʔΛ௨͢Δʯ(͋͑ͯԿॲཧ͠ͳ͍)ͩͬͨΒʁ• ঢ়گʹԠͯ͡ΤϥʔॲཧΛมߋͰ͖Δ✅• ΤϥʔॲཧΛڞ௨ԽͰ͖Δ✅
ΤϥʔΛ௨͢ΔͨΊʹ• શͯͷॲཧதࢭ• ޙ࢝Ͱඞཁͳใͷίϐʔ͕ඞཁ• ʮԿ͕ى͖ͨͷ͔ʯ• ʮͲͷॲཧΛ͍ͯͨ͠࠷தͳͷ͔ʯ
Τϥʔͷ௨ํ๏͍Ζ͍Ζ• Τϥʔίʔυ(int)Λฦ͢ (Cݴޠͱ͔)• ίʔϧόοΫΛذ͢Δ(Promise)• ΤϥʔΛλϓϧͰฦ͢ (Goͱ͔)• ྫ֎Λ͛Δ
ྫ֎Ҏ֎ͷྲྀͷ ͠·ͤΜ
ྫ֎ΛUISPX͢Δؔྫ֎ΛUISPX͢Δؔྫ֎ΛUISPX͢Δؔຊ൪ڥͰDBUDI͢Δؔ։ൃڥͰDBUDI͢ΔؔΤϥʔ͕ى͖ͨΒ ྫ֎Λ͛Δ͚ͩେଟͬͪ͜ྫ֎Λੳͯ͠ దͳޙ࢝Λ͢Δ
͋ΔؔͷҰੜॲཧ։࢝ਖ਼ৗऴྃؔݺͼग़ؔ͠ݺͼग़͠
ྫ֎͕throw͞ΕͨΒॲཧ։࢝trycatchUISPXOFX999&YDFQUJPO(͜ͷลͷॲཧ࣮ߦ͞Εͳ͍catchʹॻ͍ͯ͋Δॲཧ
ྫ֎͕ͬͯ͘ΕΔ͜ͱ• ✅શͯͷॲཧதࢭ•✅ޙ࢝ͰඞཁͳใΛ$eʹؚΊΒΕΔ•✅͋ͱͰ·ͱΊͯtry ~ catch Ͱ͖Δ
2ষͷ·ͱΊ• ΤϥʔॲཧΛ៉ྷʹ͢Δʹɺൃੜͱޙ࢝Λ͚ͯॻ͘ͱΑ͍• ྫ֎͜ͷͨΊͷػೳ
3ষPHPͷΤϥʔͱྫ֎
ͷΤϥʔؔྺ࢙తܦҢͰෳࡶ
ʮΤϥʔʯ ͱʮྫ֎ʯ
PHPͷʮΤϥʔʯ• PHPΤϯδϯࣗମ͕ΤϥʔΛ௨͢Δͱ͖ʹ͏• ใจࣈྻͷΈ• ໌ࣔతʹൃੜͤ͞Δ͜ͱͰ͖Δ• trigger_error("ഇࢭ༧ఆ", E_USER_DEPRECATED)
ΤϥʔϨϕϧʹΑͬͯಈ͖͕ҧ͏• E_ERROR ... ॲཧ͕தஅ͞ΕΔɻ΄΅෮ؼͰ͖ͳ͍• E_WARNING, E_NOTICE ͦͷଞଟ ... ॲཧதஅ͞Εͳ͍
PHPͷʮྫ֎ʯ• PHP5͔Βಋೖ͞Εͨʮྫ֎ॲཧػߏʯ• ॊೈʹΩϟονͰ͖ͯແࢹͰ͖ͳ͍• ྫ֎Ϋϥεࣗ༝ʹ֦ுͰ͖Δ• ͖ͳใΛ٧ΊͯOK
Τϥʔ ྫ֎ੲ͔Β͋Δ 1)1Ҏ߱ΤϥʔϝοηʔδͷΈؚΊΒΕΔԿͰؚΊΒΕΔɺ ΦϒδΣΫτ͝ͱ͛ΒΕΔΈࠐΈͷΤϥʔϨϕϧ͔Β બͿ͔͠ͳ͍͍͘ΒͰܕΛ૿ͤΔ ֦ுͰ͖Δઃఆ!ԋࢉࢠͰ ؆୯ʹແࢹͰ͖ΔແࢹͰ͖ͳ͍ ѲΓͭͿ͢ίʔυॻ͚Δ
Ͳ͏ݟͯྫ֎ͷํ͕ߴػೳ
ΤϥʔΛྫ֎ʹม͢Δຐ๏→Τϥʔෆཁͳͷʁ
ͦΜͳ͜ͱͳ͍ΑΤϥʔศརͳࢠͩΑ
Τϥʔͷॴ=ແࢹͰ͖Δ͜ͱ• ઃఆͰҰׅແࢹ or @ԋࢉࢠͰݸผʹແࢹ• ʮॲཧΛࢭΊΔඞཁͳ͍͕ɺϓϩάϥϚʹҰݴڭ͍͑ͨʯͱ͖ͬͪ͜ͷํ͕ศར• E_DEPRECATED͕දతͳྫ
ϥΠϒϥϦͷAPIΛมߋ͍ͨ͠ͱ͖function doSomething() {trigger_error('doSomethingͷΘΓʹdoSomething2ΛͬͯԼ͍͞',E_USER_DEPRECATED);return doSomething2();}
deprecatedΛྫ֎ʹ͢Δͱ• ྫ֎ແࢹͰ͖ͳ͍ͷͰ…• ݹ͍ؔΛ͍ͬͯΔશ͕ͯյΕΔ• શ෦मਖ਼͠ͳ͍ͱҠߦͰ͖ͳ͍• मਖ਼ͯ͠Δؒɺ৽ػೳ͕͑ͳ͍ʂ
deprecated͕ΤϥʔͳΒ• Ұ୴E_DEPRECATED, E_USER_DEPRECATEDΛແࢹ͢Δઃఆʹͯ͠Ξοϓσʔτ• ։ൃڥͰ༗ޮʹͯ͠ɺൃੜΛ௵͍ͯ͘͠• ͍ͩͿݮΒͤͨΒɺຊ൪Ͱ༗ޮʹͯ͠ɺൃੜͷ໓Λ֬ೝ͢Δ
ଞͷखஈ• /** @deprecated */• ௨ৗར༻ऀ͕ಡΜͰ͘Εͳ͍ͱҙຯͳ͍• error_log• ϩά͋͘·ͰจࣈྻͰ͔͠ͳ͍
ݸਓతͳ͍͚• ࣗͷίʔυͰྫ֎Λ͏• େͷPHPΤϥʔɺErrorExceptionʹม͢Δ• ͨͿΜόάͳͷͰಠࣗʹcatch͠ͳ͍• ͨͩ͠ɺE_DEPRECATEDܥͳͲྫ֎ʹ͠ͳ͍ํ͕ศར
set_error_handlerୈೋҾset_error_handler(function(...){throw new ErrorException(...);},E_ALL^ E_DEPRECATED^ E_USER_DEPRECATED^ E_USER_NOTICE);ϋϯυϦϯάͨ͘͠ͳ͍ΤϥʔϨϕϧΛআ֎͓ͯ͘͠
ΤϥʔϨϕϧ͍͚• E_ERROR ... PHP7Ͱྫ֎ʹͳͬͨ• E_WARNING, E_NOTICE ... େɺΫιίʔυ͕Ҿ͖ى͍ͯ͜͠ΔͷͰྫ֎ԽɻଈࠁࢭΊͯσόοά• E_STRICT, E_DEPRECATED ... ແࢹͯ͠ಈ͘ͷͰྫ֎Խ͠ͳ͍ɻඞཁʹԠͯ͡ࢹɺσόοά• E_USER_XXXX .. ͋͑ͯΤϥʔΛ͍ͬͯΔྫͳͷͰɺྫ֎ʹ͠ͳ͍͍͔ͯ͘ɻ
3ষ·ͱΊ• PHPʹʮΤϥʔʯͱʮྫ֎ʯ͕͋Δ• Τϥʔ؆୯ͳ௨ͱͯ͠ศར• ྫ֎ແࢹͰ͖ͳ͍• جຊతʹྫ֎Λ͓͏
4ষྫ֎҆શͱΦϒδΣΫτࢦ
ྫ֎ͷϓϥε໘• ίʔυதʹΤϥʔॲཧ͕ొ͠ͳ͍ͷͰɺ ៉ྷʹͳΔ• ʮίʔυఀࢭʯΛࣗಈͰͬͯ͘ΕΔ• ແࢹ͢ΔͱΫϥογϡ͢ΔͷͰແࢹͰ͖ͳ͍ɻΤϥʔॲཧΛ͖ͬͪΓߦ͏ίʔυΛཁٻ͢Δɻ
ྫ֎ͷͳ͍ੈք$ret = doSomething();if ($ret === false) {// Τϥʔॲཧ͍ͬͺ͍return false;}$ret2 = doSomething2();if ($ret2 === false) {// Τϥʔॲཧ͍ͬͺ͍return false;}
ྫ֎ͷ͋Δੈք$ret = doSomething();$ret2 = doSomething2();// ...Ͳ͔͜ݺͼग़͠ͷ ্ྲྀͷํͰҰ͚ͩ try { } catch { } ͯ͋͠ΕOK
࠶ܝɿྫ֎͕throw͞ΕͨΒॲཧ։࢝trycatch(͜ͷลͷॲཧ࣮ߦ͞Εͳ͍catchʹॻ͍ͯ͋ΔॲཧUISPXOFX999&YDFQUJPO
͓ؾ͖ͮͩΖ͏͔…
ྫ֎͕throw͞ΕͨΒॲཧ։࢝tryUISPXOFX999&YDFQUJPOcatch(͜ͷลͷॲཧ࣮ߦ͞Εͳ͍த్ͳͱ͜ΖͰࢭ·͚ͬͨͲɺ ຊʹେৎͳͷ͔ʁcatchʹॻ͍ͯ͋Δॲཧ
ྫ֎ͷϚΠφε໘• ͍ͭͲ͜Ͱॲཧ͕தஅ͞ΕΔ͔Θ͔Βͳ͍• Ͳ͜Ͱதஅ͞ΕͯΞϓϦέʔγϣϯ͕յΕͳ͍Α͏ʹؾΛ͚ͭΔඞཁ͕͋Δ• յΕͳ͍ੑ࣭Λʮྫ֎҆શʯͱݴ͏• ྫ֎Λѻ͏ਓɺ ৗʹҙࣝ͠ͳ͚ΕͳΒͳ͍
ʮྫ֎҆શʯΛάάΔͱ• C++ͷ͕ଟ͍• ྫ֎҆શҧ=ଈࢮͷੈք• ͨͩɺݴޠؔͳ͘ॏཁͰ͢ʂ• ྫΛڍ͛·͢
ྫ1
ِͷτϥϯβΫγϣϯ$db->insert($a);doSomething();$db->insert($b);...͜͜Ͱྫ֎͕ى͖ͨΒ த్ͳϨίʔυ͕Ͱ͖ͪΌ͏
DBૢ࡞தͷྫ֎• DBૢ࡞ͷ݁Ռ͕ͬͯ͠·͏• ෆ۩߹ͷݪҼʹͳΔ• ૢ࡞͕ਖ਼ৗʹऴΘ͔ͬͨɺԿͳ͔͔ͬͨɺͲͪΒ͔ʹ͢Δ = DBͷτϥϯβΫγϣϯػೳΛ͏
[ྫ֎҆શ]τϥϯβΫγϣϯ$db->beginTransaction();try {$db->insert($a);doSomething();$db->insert($b);$db->commit();} catch (\Exception $e) {$db->rollback();throw $e;}
ྫ2
κϯϏΩϟογϡif (self::$cache) return self::$cache;$result = doSomething1();self::$cache = $result;doSomething2($result);͜͜Ͱྫ֎͕ى͖ͨΒʁΩϟογϡͬͯ͠·͏͚Ͳʁ
ण໋ͷ͍มͷѻ͍ʹҙ• Ϋϥεͷstaticมɺάϩʔόϧม• ྫ֎Ͱதஅ͞Εͯੜ͖ͬͨ··• ྫ֎ൃੜΛτϥοϓͯ͠আ͢Δඞཁ͕͋Δ͔
ྫ3
Cݴޠ෩ͷؔob_start();doSomething();$output = ob_get_clean();͜͜Ͱྫ֎͕ى͖ͨΒʁPC@HFU@DMFBO ݺΕͳ͘Ͷʁ
ͦͦΈࠐΈͷ͕ؔྫ֎҆શ͡Όͳ͍• ob_start / ob_clean• fopen / fclose• ͕ؔରʹͳ͍ͬͯΔྫ͕݁ߏ͋Δ
PHPࣗମ͕कͬͯ͘ΕΔ҆શੑ• ؔϩʔΧϧͳมGC͕ճऩͯ͘͠ΕΔ• fopenͳͲͷϦιʔεܕࣗಈͰด͡ΒΕΔ• ͔͠͠ʮstaticมʯʮ֎෦γεςϜʯʮDBʯͳͲ͜ͷൣғʹؚ·Εͳ͍• ѻ͏ਓ͕ྫ֎҆શΛҙࣝ͢Δ͔͠ͳ͍
ྫ֎҆શͷ͠͞• ྫ֎҆શ͔Ͳ͏͔ػցతʹஅͮ͠Β͍• ίʔυʹؔΘΔਓશһ͕कΔඞཁ͕͋Δ• ͜Ε͕͗͢͠Δ
ྫ֎҆શΛ࣮ݱ͢ΔΠσΟΦϜू
RAII (scope & destructor)class Curl {function __construct() {$this->ch = curl_init();}function __destruct() {curl_close($this->ch); }}
RAII (scope & destructor)function req() {$ch = new Curl();//...//...}Ҏ߱ɺͲ͜Ͱॲཧ͕ தஅͯ͠σετϥΫλ͕ ޙ࢝ͯ͘͠ΕΔͷͰฏؾ
RAIIͷϋϚΓͲ͜Ζ• େ͏·͍͘͘ͷ͕ͩɺExceptionͷελοΫτϨʔεͳͲʹั·Δͱɺण໋͕৳ͼΔ• ࢥͬͨλΠϛϯάͰclose͞Εͳ͘ͳΔ͔
ൣғͰcatchͯ͠re-throwtry {...} catch (Exception $e) {... //ޙ࢝Λॻ͘throw $e;}
࠷ॳ͔ΒfinallyͰॻ͘try {$ch = curl_init();//...} finally {curl_close($ch);}
ྫ֎ͱਖ਼͖͘͠߹͏ͷ͍͠
͔͠͠ʮྫ֎ࣗମΛΘͳ͍ʯͷ͍͠
ྫ֎ͱΦϒδΣΫτࢦ• ຊདྷɺྫ֎ΦϒδΣΫτࢦͱશؔ͘ͷͳ͍֓೦• PHPExceptionΫϥεΛܧঝͨ͠ΦϒδΣΫτ͔͠throwͰ͖ͳ͍͚Ͳ• 400 ͱ͔ "Τϥʔ͕ى͖·ͨ͠" ͱ͔ΛthrowͰ͖Δݴޠ͋Δ
ΦϒδΣΫτࢦͯ͠Δͱ• ίϯετϥΫλΛଟ༻ͨ͘͠ͳΔͣ• த్ͳঢ়ଶ͕ͳ͍͜ͱ͕อূͰ͖Δ• ίϯετϥΫλͦͷ্༷ɺ Τϥʔ௨ʹྫ֎͔͑͠ͳ͍• return false ͕Ͱ͖ͳ͍͔ΒͶ
ྫ) PDO• σϑΥϧτͩͱྫ֎Λు͔ͳ͍ઃఆ• $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);• ͔͠͠ɺnew PDO͢Δͱ͖ͷΤϥʔɺઃఆʹؔͳ͘ৗʹ1%0&YDFQUJPO
࣮ࡍʹ࣮ߦͨ͠ྫphp > $pdo = new PDO('uso800');PHP Warning: Uncaught PDOException: invalid data source name in phpshell code:1Stack trace:#0 php shell code(1): PDO->__construct('uso800')#1 {main}thrown in php shell code on line 1
ͦͷଞͷࣄ• PHP7ͰE_ERROR͕ྫ֎ͷΑ͏ͳ;Δ·͍Λ͢ΔΑ͏ʹͳͬͨ• ݴޠΈࠐΈػೳঃʑʹΤϥʔ͔Βྫ֎ʹஔ͖͍͑ͯͧ͘એݴ͕ग़͍ͯΔ• ͏ɺྫ֎ͷൃੜ͠ͳ͍ੈքͳͲPHPʹͳ͍
զʑྫ֎ͱ ڞʹੜ͖Δ͔͠ͳ͍ͷͰ͢
4ষ·ͱΊ• PHPerྫ֎҆શΛҙࣝ͠·͠ΐ͏• ΫϥεΛ͑ྫ֎Λ͏Ҏ֎બࢶ͕ͳ͍ͷͰɺݡ͖͘߹͍͖ͬͯ·͠ΐ͏
5ষϙέϞϯ
try {doSomething();...} catch (Exception $e) {// do nothing}
Pokémon catching• ͨΒ͍ྫ֎ΫϥεͰcatch͍ͯ͠Δ͜ͱͷଏশ• RuntimeException/Exception/Throwable• (ϙέϞϯͷΩϟονϑϨʔζʮCatch 'emallʯ͔Β࿈ͨ͠ͱࢥΘΕΔʣ
Pokémon catchingΛ͍͚ͬͯͳ͍
ԿΛั·͍͑ͨͷ…ʁ• ྫ֎͍ΖΜͳؔͰൃੜ͢ΔՄೳੑ͕͋Δ• PHPࣗͷΤϥʔ͔͠Εͳ͍• ͋ͳͨຊʹશͯΛదʹޙॲཧͯ͠Δʁ• ͦ͏Ͱͳ͚Εɺࣗͷҙਤͨ͠ྫ֎ͷΈʹߜ͓ͬͯ͘
set_error_handlerͱͷΈ߹Θͤ• PHPΤϥʔΛErrorExceptionʹม͢Δ͜ͱ͕Ͱ͖Δ• Pokémon catching͕Έ߹Θ͞Δͱࠈ
ྫ֎ॲཧʹר͖ࠐ·ΕͯtypoͷҐஔ͕Θ͔Βͳ͍…ʂ
ɾPokémon catching• ྫ֎ࣗͷͨΊʹ༻ҙ͢Δ & ͦΕͷΈΛcatch͢Δ• class HogeException extends\RuntimeException• setterΛ૿͠·͠ΐ͏
Guzzleͷྫ
ޙ࢝͢ΔਓͷͨΊʹ• ඞཁͦ͏ͳΛExceptionΫϥεʹ٧ΊΒΕΔΑ͏ʹ͢Δ• throw (new HogeException($message, $code)) ->setFoo($foo) ->setMoo($moo);
ͱ͍͑ɺຊ൪Ͱcatch͞Εͳ͍ྫ֎͕ى͖ͨΒϠόΠ…ʂ
อݥͷset_exception_handler• catch͞Εͳ͔ͬͨྫ֎Λั·͑Δ࠷ޙͷࡆ• େͨ͜͠ͱग़དྷͳ͍ͷͰɺϩΪϯάͯ͠ϢʔβʔʹΤϥʔը໘ΛݟͤΔ͚ͩɺͱ͔• ຊ൪ͷΈಈ͔͢ɺͳΜͯ͜ͱՄೳ
͜Ε͑͋͞Εྫ֎ಥ͖ൈ͚ͳ͍set_exception_handler(function (Throwable $e) {echo 'Τϥʔ͕ى͖·ͨ͠';exit;});
શମͷ·ͱΊ
Τϥʔͱྫ֎ͷ࠶ೖ• PHPͷΤϥʔແࢹͰ͖Δ͜ͱʹՁ͕͋Γ·͢ɻdeprecatedͱͯ͠ͷ͍ํΦεεϝ• ྫ֎ศརͰ͕͢ɺྫ֎҆શΛҙࣝ͠ͳ͚Ε͍͚ͳ͍͜ͱPHPͰมΘΓ·ͤΜ• ExceptionThrowableΛอݥతҎ֎Ͱcatch͠ͳ͍Α͏ʹ͠·͠ΐ͏
We are hiring!