{"id":231156,"date":"2022-12-29T17:55:00","date_gmt":"2022-12-29T14:55:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231156"},"modified":"2022-12-29T17:56:51","modified_gmt":"2022-12-29T14:56:51","slug":"pisanie-lepszego-kodu-wordpress-phpstan","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/pisanie-lepszego-kodu-wordpress-phpstan\/","title":{"rendered":"Pisanie lepszego kodu WordPress: PHPStan"},"content":{"rendered":"\n<p>W najnowszym po\u015bcie z tej serii (kt\u00f3ry jest co prawda jaki\u015b czas temu) pisa\u0142em obszernie o <a href=\"https:\/\/wordpress.mediadoma.com\/pl\/narzedzia-do-pisania-lepszego-kodu-wordpress-kompozytor\/\" title=\"Composerze\">Composerze<\/a> i <a href=\"https:\/\/wordpress.mediadoma.com\/pl\/lepszy-kod-wordpress-plik-blokady-composer\/\" title=\"jego pliku blokuj\u0105cym.\">jego pliku blokuj\u0105cym.<\/a><\/p>\n<p>Polecam przeczytanie dw\u00f3ch poprzednich artyku\u0142\u00f3w, poniewa\u017c Composer w ko\u0144cu odegra rol\u0119 w tym materiale, kt\u00f3rym udost\u0119pnimy ten i przysz\u0142e posty. Ale je\u015bli zdecydujesz si\u0119 ich nie dogoni\u0107 (lub znasz ju\u017c Composer), to sedno poprzednich post\u00f3w jest odpowiednio nast\u0119puj\u0105ce:<\/p>\n<blockquote>\n<p>Nie polecam sprawdzania katalogu dostawc\u00f3w w swoim repozytorium. Mo\u017ce to sta\u0107 si\u0119 p\u00f3\u017aniej ogromnym katalogiem i mo\u017ce podwa\u017cy\u0107 ca\u0142y cel Composera.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/narzedzia-do-pisania-lepszego-kodu-wordpress-kompozytor\/\" title=\"Kompozytor\">Kompozytor<\/a><\/p>\n<p>Celem jest upewnienie si\u0119, \u017ce ka\u017cdy z nich korzysta z tej samej wersji zale\u017cno\u015bci projektu \u2013 nie starsze wersje, nie nowsze wersje \u2013 ale ta sama wersja.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/lepszy-kod-wordpress-plik-blokady-composer\/\" title=\"Plik blokady kompozytora\">Plik blokady kompozytora<\/a><\/p>\n<\/blockquote>\n<p>Maj\u0105c to na uwadze, istnieje wiele zale\u017cno\u015bci lub pakiet\u00f3w, kt\u00f3re mo\u017cemy zainstalowa\u0107, kt\u00f3re pomog\u0105 nam upewni\u0107 si\u0119, \u017ce piszemy kod najwy\u017cszej mo\u017cliwej jako\u015bci.<\/p>\n<p>Jasne, niekt\u00f3re z nich mog\u0105 mie\u0107 form\u0119 czego\u015b w rodzaju standard\u00f3w kodowania, ale tak naprawd\u0119 s\u0105 to bardziej zasady ni\u017c elementy pisania wysokiej jako\u015bci kodu (cho\u0107 nie s\u0105dz\u0119, aby by\u0142y pomijane w dyskusji \u2013 po prostu pomini\u0119te w tej chwili \ud83d\ude43).<\/p>\n<p>Wr\u00f3\u0107 do narz\u0119dzi, o kt\u00f3rych mowa: Jakie s\u0105 narz\u0119dzia, kt\u00f3re pomagaj\u0105 pisa\u0107 wysokiej jako\u015bci kod WordPress? Podziel\u0119 si\u0119 kilkoma z moich ulubionych i opowiem o tym, jak mo\u017cemy je wszystkie wykorzysta\u0107 w oparciu o kod.<\/p>\n<p>Najpierw sp\u00f3jrzmy na analiz\u0119 statyczn\u0105 za pomoc\u0105 <a href=\"https:\/\/github.com\/phpstan\/phpstan\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHPStan<\/a>.<\/p>\n<h2>Lepszy kod WordPress z PHPStan<\/h2>\n<h3>Czym w\u0142a\u015bciwie jest analiza statyczna?<\/h3>\n<p>Najpierw kilka s\u0142\u00f3w o analizie statycznej. Mianowicie, co to jest? Po pierwsze, to k\u0119s:<\/p>\n<blockquote>\n<p>Statyczna analiza kodu (znana r\u00f3wnie\u017c jako analiza kodu \u017ar\u00f3d\u0142owego) jest zwykle wykonywana jako cz\u0119\u015b\u0107 przegl\u0105du kodu (znanego r\u00f3wnie\u017c jako testowanie bia\u0142oskrzynkowe) i jest przeprowadzana na etapie wdra\u017cania cyklu rozwoju zabezpiecze\u0144 (SDL).<\/p>\n<p>Statyczna analiza kodu zwykle odnosi si\u0119 do uruchamiania narz\u0119dzi statycznej analizy kodu, kt\u00f3re pr\u00f3buj\u0105 wskaza\u0107 mo\u017cliwe luki w \u201estatycznym&quot; (nieuruchamiaj\u0105cym si\u0119) kodzie \u017ar\u00f3d\u0142owym za pomoc\u0105 technik, takich jak analiza defekt\u00f3w i analiza przep\u0142ywu danych.<\/p>\n<p><a href=\"https:\/\/www.owasp.org\/index.php\/Static_Code_Analysis\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Statyczna analiza kodu przez OWASP<\/a><\/p>\n<\/blockquote>\n<p>Pomy\u015bl o tym w ten spos\u00f3b: jest to spos\u00f3b na analiz\u0119 programu pod k\u0105tem potencjalnych b\u0142\u0119d\u00f3w, kt\u00f3rych mo\u017cesz nie zauwa\u017cy\u0107 podczas pracy z baz\u0105 kodu.<\/p>\n<p>Oznacza to, \u017ce istniej\u0105 problemy, b\u0142\u0119dy, problemy z bezpiecze\u0144stwem, kt\u00f3re mog\u0105 wyst\u0119powa\u0107, ale nie mo\u017cna ich wykry\u0107 z wielu powod\u00f3w (z kt\u00f3rych najmniejszym jest to, \u017ce jeste\u015b zbyt blisko kodu).<\/p>\n<p>Jednak z biegiem czasu spo\u0142eczno\u015b\u0107 programist\u00f3w nauczy\u0142a si\u0119 analizowa\u0107 kod, generowa\u0107 zestawy regu\u0142 i budowa\u0107 narz\u0119dzia, kt\u00f3re pomagaj\u0105 znale\u017a\u0107 dok\u0142adnie wszystkie powy\u017csze elementy.<\/p>\n<h3>Analiza statyczna kodu zorientowanego na WordPress<\/h3>\n<p>I tu w\u0142a\u015bnie pojawia si\u0119 PHPStan.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-159518-61e6f6b3d2b7f.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-159518-61e6f6b3d2b7f.png\" alt=\"Pisanie lepszego kodu WordPress: PHPStan\"><\/a><\/p>\n<p>Jak wspomniano, celem pakietu jest identyfikacja b\u0142\u0119d\u00f3w lub b\u0142\u0119d\u00f3w, kt\u00f3re istniej\u0105 w twoim kodzie, zanim tw\u00f3j kod zostanie u\u017cyty przez kogo\u015b innego ni\u017c programi\u015bci, pod\u015bwietlenie ich i umo\u017cliwienie ich naprawienia.<\/p>\n<p>Poniewa\u017c narz\u0119dzia takie jak to sprawdzaj\u0105 baz\u0119 kodu (w przeciwie\u0144stwie do uruchamiania kodu), nie zawsze jest mo\u017cliwe uzyskanie jasnego obrazu. Oznacza to, \u017ce mo\u017cemy uzyska\u0107 fa\u0142szywe alarmy.<\/p>\n<p>Wi\u0119cej o tym za chwil\u0119.<\/p>\n<p>Je\u015bli interesuje Ci\u0119 rozpocz\u0119cie pracy z PHPStan w oparciu o Tw\u00f3j kod, jest to \u0142atwe. Po zainstalowaniu pami\u0119taj tylko, aby skonfigurowa\u0107 go tak, aby nie wygl\u0105da\u0142 w <code>vendor<\/code>katalogu lub, powiedzmy, rdzeniu WordPressa.<\/p>\n<p>Zamiast tego popro\u015b go o sprawdzenie kodu.<\/p>\n<h3>Instalowanie PHPStan<\/h3>\n<p>Najpierw w swoim <code>composer.json<\/code>pliku dodaj nast\u0119puj\u0105cy wiersz w <code>require-dev<\/code>sekcji:<\/p>\n<p><code>\"phpstan\/phpstan\": \"^0.11.12\"<\/code><\/p>\n<p>Nast\u0119pnie uruchom <code>composer update<\/code>w swoim terminalu.<\/p>\n<p>Po zainstalowaniu mo\u017cesz go uruchomi\u0107 na pojedynczym pliku, katalogu lub zestawie katalog\u00f3w. Je\u015bli czyta\u0142e\u015b moje poprzednie posty na temat organizacji kodu, wiesz, \u017ce jestem fanem trzymania wi\u0119kszo\u015bci kodu \u017ar\u00f3d\u0142owego projektu pod r\u0119k\u0105 <code>src<\/code>, mo\u017cesz uruchomi\u0107 co\u015b takiego:<\/p>\n<p><code>$ vendor\/bin\/phpstan analyse src<\/code><\/p>\n<p>Spowoduje to wygenerowanie danych wyj\u015bciowych na podstawie tego, co znajdzie narz\u0119dzie.<\/p>\n<p>Pami\u0119tasz, kiedy powiedzia\u0142em, \u017ce mo\u017ce znale\u017a\u0107 takie rzeczy, jak fa\u0142szywe alarmy? Oto bardziej szczeg\u00f3\u0142owe zestawienie tego, co mo\u017cesz zobaczy\u0107:<\/p>\n<ul>\n<li>Dodatkowe argumenty przekazywane do funkcji (np. funkcja wymaga dw\u00f3ch argument\u00f3w, kod przekazuje trzy)<\/li>\n<li>Dodatkowe argumenty przekazywane do funkcji print\/sprintf (np. ci\u0105g formatuj\u0105cy zawiera jeden symbol zast\u0119pczy, kod przekazuje dwie warto\u015bci do zast\u0105pienia)<\/li>\n<li>Oczywiste b\u0142\u0119dy w martwym kodzie<\/li>\n<li>Magiczne zachowanie, kt\u00f3re nale\u017cy zdefiniowa\u0107.<\/li>\n<\/ul>\n<p>Wszystkie powy\u017csze prosto z <a href=\"https:\/\/github.com\/phpstan\/phpstan\/tree\/0.11.12\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">repozytorium<\/a>.<\/p>\n<p>W tym miejscu <a href=\"https:\/\/github.com\/phpstan\/phpstan\/tree\/0.11.12#rule-levels\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">poziomy regu\u0142<\/a> mog\u0105 mie\u0107 znaczenie, chocia\u017c mo\u017ce wymaga\u0107 troch\u0119 poprawek, aby uzyska\u0107 poziom odpowiedni dla twojego zespo\u0142u lub projektu.<\/p>\n<h3>A co z analiz\u0105 dla WordPressa?<\/h3>\n<p>Viktor Sz\u00e9pe podzieli\u0142 si\u0119 ze mn\u0105 <a href=\"https:\/\/packagist.org\/packages\/szepeviktor\/phpstan-wordpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tym zasobem<\/a> (a w\u0142a\u015bciwie czym\u015b, co jest jego autorem) i my\u015bl\u0119, \u017ce jest to co\u015b istotnego i u\u017cytecznego. Idea pakietu jest prosta:<\/p>\n<blockquote>\n<p>Rozwi\u0105zuje wszystkie problemy, kt\u00f3re mia\u0142em podczas analizy kodu dla WordPressa.<\/p>\n<\/blockquote>\n<p>Nie\u017ale, prawda?<\/p>\n<h2>Przeanalizuj sw\u00f3j kod<\/h2>\n<p>Niezale\u017cnie od Twojego projektu, organizacji kodu, czy poziomu, na kt\u00f3rym uruchamiasz to konkretne narz\u0119dzie, zawsze chodzi o popraw\u0119 jako\u015bci pisania kodu WordPress.<\/p>\n<p>Zainstalowanie tego jako pakietu Composer, a nast\u0119pnie uruchomienie go w swoim <code>src<\/code>katalogu to krok we w\u0142a\u015bciwym kierunku.<\/p>\n<p>Jak wcze\u015bniej wspomniano, podziel\u0119 si\u0119 kilkoma innymi narz\u0119dziami, a nast\u0119pnie podziel\u0119 si\u0119 tym, jak je wszystkie uruchomi\u0107 w bazie kodu przed zatwierdzeniem kodu w repozytorium.<\/p>\n<h3>Notatka<\/h3>\n<p>Je\u015bli masz problem z konfiguracj\u0105 pakietu, <a href=\"https:\/\/davemackey.net\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Dave Mackey<\/a> skontaktowa\u0142 si\u0119 ze mn\u0105 z podobnym problemem i jego <a href=\"https:\/\/github.com\/szepeviktor\/phpstan-wordpress\/issues\/8\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">rozwi\u0105zaniem<\/a>.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wr\u00f3\u0107 do narz\u0119dzi, o kt\u00f3rych mowa: Jakie s\u0105 narz\u0119dzia, kt\u00f3re pomagaj\u0105 pisa\u0107 wysokiej jako\u015bci kod WordPress? Zacznijmy od PHPStan.<\/p>\n","protected":false},"author":1,"featured_media":236988,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,784,752,805,845],"tags":[1169],"class_list":["post-231156","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-oprogramowanie-open-source","category-otwarte-zrodlo","category-php-7","category-samouczki","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/231156","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=231156"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/231156\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/236988"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=231156"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=231156"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=231156"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}