#PHPerKaigi 2020 での発表資料です。 https://fortee.jp/phperkaigi-2020/proposal/8f41e23f-69ef-4f93-8625-db64be39248f
੩తղੳͷҭͯํPHPerKaigi 2020Yuichi Sugiyama@oogFranz
View Slide
Whoami• ਿࢁ ༞Ұ @oogFranz• αΠϘζ5ΤϯδχΞ• ෳۀδϟζϛϡʔδγϟϯ@MASHݭָஂ• Spotify, Apple MusicͳͲͰ৴தʂ
αΠϘζ Garoon• େن͚ͷάϧʔϓΣΞ• ੜ࢈ੑɾνʔϜϫʔΫ্ͷࢧԉ
αΠϘζ Garoon• PHPͱMySQLͰͰ͖ͯΔWebΞϓϦέʔγϣϯ• ։ൃ18• PHP 4͔Β7.2ʹ• PHPͷίʔυ180ສߦ͘Β͍
αΠϘζ Garoon• PHPͱMySQLͰͰ͖ͯΔWebΞϓϦέʔγϣϯ• ։ൃ18• PHP 4͔Β7.2ʹ• PHPͷίʔυ180ສߦ͘Β͍ͳ͔ͳ͔ϨΨγʔʂ
ϨΨγʔίʔυΛ៉ྷʹͯ͠Δʂ·ͣطଘ࣮ΛΑ͘ಡΜͰΈΑ͏ʂϨΨγʔʹཱ͔͓ͪ͏ʂ
খੴʹͭ·ͣ͘PHPDoc͕ͳͯ͘ ίʔυ͕͑ͳ͍ɻɻɻ͜͜ͷίʔυͣͬͱಡΜͰ͚ͨͲɺ ͦͦ୭ݺͼग़ͯ͠ͳ͍ɻɻɻʁ͜͜ͷίʔυTypo͔ͬΓɻɻɻ
খੴʹͭ·ͣ͘PHPDoc͕ͳͯ͘ ίʔυ͕͑ͳ͍ɻɻɻ͜͜ͷίʔυͣͬͱಡΜͰ͚ͨͲɺ ͦͦ୭ݺͼग़ͯ͠ͳ͍ɻɻɻʁ͜͜ͷίʔυTypo͔ͬΓɻɻɻຊ࣭తͳʢઃܭͳͲʣʹͨͲΓண͘લʹɺ খ͞ͳ͕ؾʹͳͬͯίʔυϦʔσΟϯά͕ਐ·ͳ͍
খੴʹͭ·ͣ͘PHPDoc͕ͳͯ͘ ίʔυ͕͑ͳ͍ɻɻɻ͜͜ͷίʔυͣͬͱಡΜͰ͚ͨͲɺ ͦͦ୭ݺͼग़ͯ͠ͳ͍ɻɻɻʁ͜͜ͷίʔυTypo͔ͬΓɻɻɻ·ͣখੴΛআڈ͢Δɻ ੩తղੳπʔϧΛೖΕΑ͏ʂ
੩తղੳͱʁ• ίʔυΛ࣮ߦͤͣʹߦ͏ݕূ• ಈతղੳɿUnit TestɺϚχϡΞϧςετ• ςετ͕ͳ͍ϨΨγʔϓϩμΫτͰಋೖՄೳ
Phan• https://github.com/phan/phan• PHPDocͰܕਪ͢Δ੩తղੳπʔϧ• Etsyࣾͷ։ൃ͕ݩ• ※PHPStanPHPMDͱͷൺֱࠓճ͠·ͤΜ
ͬͯΈͨ
ਘৗ͡Όͳ͍issue
ਘৗ͡Όͳ͍issueղੳ݁ՌΛॖখදࣔͨ͠ͷʢҰ෦ʣ
ਘৗ͡Όͳ͍issue• ͦΕ·Ͱ੩తղੳͰอޢ͞Ε͍ͯͳ͍ίʔυ جຊతʹແͷissue͕ใࠂ͞ΕΔ• ·ͱʹऔΓ߹͏ͱ৺͕ંΕΔ• Τϥʔͷใࠂ͕গͳͯ͘·ͣCIʹೖΕ͍ͨ
ਘৗ͡Όͳ͍issue• ͦΕ·Ͱ੩తղੳͰอޢ͞Ε͍ͯͳ͍ίʔυ جຊతʹແͷissue͕ใࠂ͞ΕΔ• ·ͱʹऔΓ߹͏ͱ৺͕ંΕΔ• Τϥʔͷใࠂ͕গͳͯ͘·ͣCIʹೖΕ͍ͨग़ͯΔJTTVFͷछྨ͝ͱʹରॲͯ͠ ͻͱ·ͣ$*Λಋೖ͢Δ
Phanͷ߹ʢconfig.phpʣ
Phanͷ߹ʢconfig.phpʣTVQQSFTT@JTTVF@UZQFT੍͍ͨ͠*TTVF5ZQFΛ ྻڍ͢Δ
• Phanͷ࣮ߦ݁Ռ͔ΒੜͰ͖Δsuppress_issue_types$cat analysis.txt | cut -f 2 -d ' '|\sort -u | sed "s/^/'/g" | sed "s/$/',/g"
• Phanͷ࣮ߦ݁Ռ͔ΒੜͰ͖Δsuppress_issue_types$cat analysis.txt | cut -f 2 -d ' '|\sort -u | sed "s/^/'/g" | sed "s/$/',/g"$*͕ಋೖͰ͖ͨʂ
• Phanͷ࣮ߦ݁Ռ͔ΒੜͰ͖Δsuppress_issue_types$cat analysis.txt | cut -f 2 -d ' '|\sort -u | sed "s/^/'/g" | sed "s/$/',/g"͕ɺ΄΅Τϥʔใࠂ͞Εͳ͍ɻɻɻ
• Phanͷ࣮ߦ݁Ռ͔ΒੜͰ͖Δsuppress_issue_types$cat analysis.txt | cut -f 2 -d ' '|\sort -u | sed "s/^/'/g" | sed "s/$/',/g"͔͜͜Β੩తղੳΛҭͯΑ͏ʂ
੩తղੳͷҭͯํ
੩తղੳΛҭͯΔϧʔϓ͢Issue TypeΛ ܾΊΔͥΜͿ͢CIʹө͢Δʢsuppress_issue_types͔Βͳ͘͢ʣ
੩తղੳΛҭͯΔϧʔϓ͢Issue TypeΛ ܾΊΔͥΜͿ͢CIʹө͢Δʢsuppress_issue_types͔Βͳ͘͢ʣΈ͘ʹରॲͩ͢͠ͱͭΒ͍ͷͰɺ ҭ͕͍ͯͷ͋Δ*TTVF5ZQFΛޮΑ͘୳͍ͯ͜͠͏
ҭ͕͍ͯͷ͋ΔIssue TypeΛ୳࣠͢ΤϥʔͷՄೳੑ͕ߴ͍͔ϦεΫίετ ؆୯ʹͤΔ͔
ϦεΫ: ΤϥʔͷՄೳੑ͕ߴ͍͔• ࠓۮવಈ͍͍ͯΔ• ݺͼग़͠ํʹΑ࣮ͬͯߦ࣌ΤϥʔʹͳΔ• ࣅͨΑ͏ͳίʔυ͕૿͑ΔલʹஅͪΓ͍ͨ• ΤϥʔϨϕϧΛઃఆͯ͠੩తղੳ͢Δ
Phanͷ߹ʢconfig.phpʣNJOJNVN@TFWFSJUZൃੜͤ͞ΔΤϥʔϨϕϧͷઃఆ
Phanͷ߹ʢconfig.phpʣҰԠஈ֊͕ͩɺ࣮࣭Issue::SEVERITY_LOW;Issue::SEVERITY_NORMAL;Issue::SEVERITY_CRITICAL;ͷ̏ஈ֊NJOJNVN@TFWFSJUZൃੜͤ͞ΔΤϥʔϨϕϧͷઃఆ
PhpStormͷ߹: Inspect Code• PhpStorm https://www.jetbrains.com/ja-jp/phpstorm/• ΈΜͳେ͖PHPͷIDE• ϓϩδΣΫτͷҟৗίʔυΛ ϑΝΠϧΛ։͚ͩ͘Ͱݕग़ͯ͘͠ΕΔʂ• ϓϩδΣΫτશମͷInspectionϨϙʔτΛ ग़ྗͰ͖Δ
Inspect Code• Find Action (Ctrl + Shift + A, ⌘+⇧+A )ʹ “Inspect”ͱೖΕͯΈΔ
• ॏཁผʹInspection ݁Ռ͕ग़ྗ͞ΕΔInspect Code
খωλ• Inspection͕࣮ߦͰ͖ͳ͍ͱ͖ϝϞϦΛ͢• Help -> Change Memory Setting͔ΒมߋͰ͖Δ
ίετ: ؆୯ʹͤΔ͔• ָʹमਖ਼Ͱ͖Δ͜ͱ͔Β࢝ΊΑ͏• ͷগͳ͍Issue TypeΛ୳͢• ػցతʹमਖ਼Ͱ͖ΔIssueΛ୳͢• ෆཁίʔυআ
• Phanͷ࣮ߦ݁Ռ͔Βݟસ͏• PhanͷWikiʹ͋ΔίϚϯυͷগͳ͍Issue Typehttps://github.com/phan/phan/wiki/Tutorial-for-Analyzing-a-Large-Sloppy-Code-Base$cat analysis.txt | cut -d ' ' -f2 |\sort | uniq -c | sort -n -r
• Phanͷ࣮ߦ݁Ռ͔Βݟસ͏• PhanͷWikiʹॻ͍ͯ͋ΔίϚϯυͷগͳ͍Issue Typehttps://github.com/phan/phan/wiki/Tutorial-for-Analyzing-a-Large-Sloppy-Code-Base$cat analysis.txt | cut -d ' ' -f2 |\sort | uniq -c | sort -n -rؤுΕͤͦ͏
ͷଟ͍Issue Type• 1ߦमਖ਼͢Δ͚ͩͰɺඦͷIssueΛ ফ͢͜ͱ͕Ͱ͖Δ߹͋Δ• PHPDoc͕͓͔͍͠ͱ͔
ͷଟ͍Issue Type• 1ߦमਖ਼͢Δ͚ͩͰɺඦͷIssueΛ ফ͢͜ͱ͕Ͱ͖Δ߹͋Δ• PHPDoc͕͓͔͍͠ͱ͔/*** @return Barɺଓʹࣦഊͨ͠߹false*/public function foo(){ɹ…}
ͷଟ͍Issue Type• 1ߦमਖ਼͢Δ͚ͩͰɺඦͷIssueΛ ফ͢͜ͱ͕Ͱ͖Δ߹͋Δ• PHPDoc͕͓͔͍͠ͱ͔/*** @return Barɺଓʹࣦഊͨ͠߹false*/public function foo(){ɹ…}ϊΠζʹͳΔͷͰαΫοͱͦ͏
ػցతʹमਖ਼Ͱ͖ΔIssue• PhpStormͷ͍͔ͭ͘ͷInspectionʹ Auto fixػೳ͕͍͍ͯΔ
PhpStormͷAuto fix• ͲͷInspectionʹAuto fix͕͋Δ͔ ࣮ࡍʹͬͯΈΔ͔͠ͳͦ͞͏• ͷʹΑͬͯAuto fixͰյΕΔ͜ͱ͕͋ΔͷͰ৻ॏ• Auto fix͕͍͍ͯΔ͜ͱ͕ଟ͍ͷɺ• Unnecessary ~ܥͷInspection• Code StyleܥͷInspection• Missing ~ ܥͷPHPDocͷInspection
Run Inspection by Name• Inspectionͷ໊લΛࢦఆ࣮ͯ͠ߦͰ͖Δ
ෆཁίʔυআ• ϑΝΠϧɾϝιουɾΫϥε୯ҐͰ͋Εɺ ୯ʹআ͢Δ͚ͩͰΑ͍• ෆཁίʔυ࣮ͦͦߦ͞Ε͍ͯͳ͍ͷͰɺ ෆ۩߹ίʔυ͕͍ͬͯΔ͜ͱଟ͍• ੩తղੳͷअຐʹͳΔͷͰ ·ͣআ͢Δͷ͕Φεεϝ
ෆཁίʔυͷݟ͚ͭํ• PhpStormͷUnused ~ ܥͷInspection• Phanͷ--dead-code-detection
੩తղੳ͕νʔϜΛҭͯΔ
੩తղੳͰϨϏϡʔ͕͔ΘΔ• ϨϏϡʔͰখ͍͞ࢦఠ͕ଟ͘ͳΔͱɺ ຊ࣭తͳେ͖ͳͷࢦఠ͕͘͠ͳΔ• ϓϧϦΫͷখੴ͕গͳ͘ͳΕɺ ͦΕ͚ͩຊ࣭తͳͷϨϏϡʔ͕Մೳʹ• ؍ΛߜΓࠐΜͰͷϨϏϡʔ
؍ΛߜΓࠐΜͰͷϨϏϡʔ࡚म࢘ஶؒҧ͍ͩΒ͚ͷઃܭϨϏϡʔ<վగ൛>1ΑΓҾ༻
੩తղੳ͕νʔϜΛҭͯΔ• ϨϏϡʔͰখ͍͞ࢦఠΛ͠ͳͯ͘Α͘ͳΔͷͰ ຊ࣭తͳΛϨϏϡʔͰ͖Δ• νʔϜϝϯόʔ͕ࣗવͱྑ͍ ίʔσΟϯάΛֶΔ• طଘίʔυͱҰ؏ੑΛ࣋ͬͯ ৽نίʔυΛॻ͖͘͢ͳΔ
·ͱΊ• খ͞ͳΛݮΒ͢ɾ૿͞ͳ͍ͨΊʹ ੩తղੳʹͨͭ• ϦεΫͷߴ͍ͱ͜Ζ͔Βɺ੩తղੳΛҭͯΑ͏• ίετͷ͍ͱ͜Ζ͔Βɺ੩తղੳΛҭͯΑ͏• ੩తղੳΛҭͯΔͱνʔϜ͕ҭͭ
Speaker asks…• @suppress, @noinspectionͳͲΛ͏ͷ ͋Γʁͳ͠ʁϧʔϧʁ• IDEΛνʔϜͰ౷Ұ͍ͤͨ͞ͳΜͰ͕͢ɺ Έͳ͞ΜͲ͏Ͱ͔͢ʁ• ੩తղੳͷίΞͳػೳʢPhanͷΞϊςʔγϣϯͱ͔ʣ ͏ͷ͋Γʁͳ͠ʁ