{"id":228654,"date":"2022-10-29T09:17:00","date_gmt":"2022-10-29T06:17:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228654"},"modified":"2022-11-09T03:35:18","modified_gmt":"2022-11-09T00:35:18","slug":"przestrzenie-nazw-i-automatyczne-ladowanie-w-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/przestrzenie-nazw-i-automatyczne-ladowanie-w-wordpress\/","title":{"rendered":"Przestrzenie nazw i automatyczne \u0142adowanie w WordPress"},"content":{"rendered":"\n<p>W zesz\u0142ym tygodniu wyg\u0142osi\u0142em prezentacj\u0119 na <a href=\"https:\/\/2017.atlanta.wordcamp.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordCamp Atlanta<\/a> na temat przestrzeni nazw i automatycznego \u0142adowania. (pe\u0142ny tytu\u0142 to Przestrzenie nazw, automatyczne \u0142adowanie i ulepszanie architektury wtyczek, ale to k\u0119s, prawda?)<\/p>\n<p>Ze wzgl\u0119du na charakter rozmowy zdecydowa\u0142em si\u0119 napisa\u0107 post towarzysz\u0105cy postowi, udost\u0119pni\u0107 slajdy i udost\u0119pni\u0107 przyk\u0142adow\u0105 wtyczk\u0119 GitHub, aby wesprze\u0107 rozmow\u0119.<\/p>\n<p>Wi\u0119c je\u015bli by\u0142e\u015b obecny, dzi\u0119kuj\u0119 (!) i oto post, obieca\u0142em. A dla tych z Was, kt\u00f3rzy nie uczestniczyli, mam nadziej\u0119, \u017ce ten post nadal pomo\u017ce zademonstrowa\u0107 koncepcje i tematy <a href=\"https:\/\/tommcfarlin.com\/wordcamp-atlanta-2017\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">, kt\u00f3re omawia\u0142em na WordCamp<\/a>.<\/p>\n<h2>Przestrzenie nazw i automatyczne \u0142adowanie<\/h2>\n<p>Zanim om\u00f3wi\u0119 przestrzenie nazw i automatyczne \u0142adowanie w WordPressie, chc\u0119 o tym porozmawia\u0107, poniewa\u017c mo\u017ce to bezpo\u015brednio wp\u0142yn\u0105\u0107 na jako\u015b\u0107 kodu i mo\u017ce to robi\u0107 przez wiele miesi\u0119cy i lat.<\/p>\n<p>W ko\u0144cu niewielu z nas, programist\u00f3w, zadaje ju\u017c pytanie:<\/p>\n<blockquote>\n<p>Jak mo\u017cemy uczyni\u0107 nasz kod lepszym ni\u017c jest?<\/p>\n<\/blockquote>\n<p>A wielu z nas jest wystarczaj\u0105co inteligentnych, by wiedzie\u0107 to, czego nie wiemy. Mamy wi\u0119c do czynienia z prac\u0105 w ramach ogranicze\u0144, kt\u00f3re s\u0105 nam dane.<\/p>\n<p>Czasami mamy czas, aby zbada\u0107, jak to zrobi\u0107; innym razem pracujemy z wiedz\u0105, kt\u00f3r\u0105 posiadamy. I nie ma w tym nic z\u0142ego.<\/p>\n<p>Ale poniewa\u017c wiemy to, czego nie wiemy, wiemy, \u017ce istnieje potencja\u0142 na wi\u0119cej.<\/p>\n<h3>Po pierwsze, Tw\u00f3j kod<\/h3>\n<p>Je\u015bli chodzi o poruszanie temat\u00f3w takich jak przestrzenie nazw i automatyczne \u0142adowanie w kontek\u015bcie WordPressa, my\u015bl\u0119, \u017ce cz\u0119sto spotykamy si\u0119 z mieszanymi odpowiedziami.<\/p>\n<p>W ko\u0144cu mogliby\u015bmy rozmawia\u0107 o takich rzeczach jak <a href=\"https:\/\/codex.wordpress.org\/Theme_Customization_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">The Theme Customizer<\/a> lub <a href=\"https:\/\/developer.wordpress.org\/rest-api\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">REST API<\/a> lub o czym\u015b bardziej zabawnym.<\/p>\n<p>Chodzi mi o to, \u017ce \u201eprzestrzenie nazw i automatyczne \u0142adowanie&quot; po prostu nie brzmi ekscytuj\u0105co ani post\u0119powo w por\u00f3wnaniu z nowszymi dost\u0119pnymi funkcjami i technologiami, prawda?<\/p>\n<p>Ale nie, tak naprawd\u0119 nie s\u0105 nudne. W tym po\u015bcie i towarzysz\u0105cej mu prezentacji oraz kodzie \u017ar\u00f3d\u0142owym poka\u017c\u0119, dlaczego i dlaczego tak nie jest.<\/p>\n<h4>Nie s\u0105 nudni<\/h4>\n<p>My\u015bl\u0119, \u017ce mo\u017cna uczciwie powiedzie\u0107, \u017ce programi\u015bci \u2013 przynajmniej cz\u0119\u015b\u0107 z nas lub ich cz\u0119\u015b\u0107, w zale\u017cno\u015bci od tego, jak siebie postrzegasz \u2013 s\u0105 znani z k\u0142\u00f3tni o aspekty programowania.<\/p>\n<p>\u2013 I tak nudna rozmowa.<\/p>\n<p>W rzeczywisto\u015bci nie jest niczym niezwyk\u0142ym s\u0142ysze\u0107, jak kto\u015b k\u0142\u00f3ci si\u0119 o najlepszy spos\u00f3b na zainicjowanie i napisanie p\u0119tli for, kt\u00f3ra jest tak wydajna, jak to mo\u017cliwe podczas iteracji na ma\u0142ym zestawie bazy danych, pomimo faktu, \u017ce mamy czterordzeniowe procesory i 16 GB pami\u0119ci RAM w naszych komputerach stacjonarnych.<\/p>\n<p>Je\u015bli wi\u0119c tak bardzo zale\u017cy nam na czym\u015b tak ma\u0142ym, na pewno zale\u017cy nam na szerszym obrazie. Rzeczy takie jak:<\/p>\n<ul>\n<li>Ulepszony kod<\/li>\n<li>Lepsza organizacja<\/li>\n<li>Zwi\u0119kszona \u0142atwo\u015b\u0107 konserwacji<\/li>\n<li>\u0141atwiejsze debugowanie<\/li>\n<li>Zarabianie wi\u0119cej pieni\u0119dzy (no, mo\u017ce).<\/li>\n<\/ul>\n<p>A przestrzenie nazw i automatyczne \u0142adowanie mog\u0105 prowadzi\u0107 bezpo\u015brednio do wszystkich powy\u017cszych (c\u00f3\u017c, nie mog\u0119 m\u00f3wi\u0107 o pieni\u0105dzach, ale ma potencja\u0142).<\/p>\n<p>Gdybym mia\u0142 podsumowa\u0107 przestrzenie nazw r\u00f3l i miejsce automatycznego \u0142adowania we wszystkich powy\u017cszych, powiedzia\u0142bym, \u017ce:<\/p>\n<p>Przestrzenie nazw i automatyczne \u0142adowanie prowadz\u0105 do ulepszonego kodu poprzez lepsz\u0105 organizacj\u0119, podzia\u0142 na sekcje lub modularyzacj\u0119 oraz \u015bci\u015blejsz\u0105 relacj\u0119 poprzez ich koncepcje.<\/p>\n<p>Co wi\u0119cej, zwi\u0119ksza to \u0142atwo\u015b\u0107 konserwacji, poniewa\u017c kod jest zorganizowany w pakiety, co mo\u017ce prowadzi\u0107 do \u0142atwiejszego debugowania w miar\u0119 rozwoju produktu.<\/p>\n<p>Wszystko to mo\u017ce prowadzi\u0107 do oszcz\u0119dno\u015bci czasu lub lepszego wykorzystania czasu, co w zale\u017cno\u015bci od modelu biznesowego mo\u017ce mie\u0107 wp\u0142yw na wyniki finansowe.<\/p>\n<p>Ale to nadal nie opisuje \u017cadnej z tych rzeczy. Ale z pewno\u015bci\u0105 w tym momencie brzmi\u0105 bardziej interesuj\u0105co ni\u017c wtedy, gdy zosta\u0142y wprowadzone po raz pierwszy.<\/p>\n<h4>Wi\u0119c czym one s\u0105?<\/h4>\n<p>Zanim przejdziemy do definicji ka\u017cdego z nich i r\u00f3l, jakie pe\u0142ni\u0105, przyjrzyjmy si\u0119, jak brak przestrzeni nazw i automatyczne \u0142adowanie w WordPressie negatywnie wp\u0142yn\u0119\u0142o na twoje do\u015bwiadczenie podczas korzystania z motyw\u00f3w, wtyczek, dodatk\u00f3w lub czegokolwiek innego.<\/p>\n<p>Cofnijmy si\u0119 wi\u0119c na chwil\u0119 i przyjrzyjmy si\u0119 ka\u017cdemu z osobna.<\/p>\n<h5>Przestrzenie nazw<\/h5>\n<p>Wyobra\u017a sobie, \u017ce odziedziczy\u0142e\u015b projekt i zaraz zaczniesz nad nim pracowa\u0107. Powiedz, \u017ce to wtyczka WordPress.<\/p>\n<p>Instalujesz go; idziesz go aktywowa\u0107, a nast\u0119pnie dostajesz co najmniej jedno z tych:<\/p>\n<ul>\n<li>By\u0107 mo\u017ce widzisz t\u0119 paskudn\u0105 wiadomo\u015b\u0107 porz\u0105dkow\u0105 u g\u00f3ry okna przegl\u0105darki wy\u015bwietlaj\u0105c\u0105 \u015blad stosu.<\/li>\n<li>Mo\u017ce widzisz komunikat m\u00f3wi\u0105cy o jakim\u015b konflikcie z innym istniej\u0105cym pakietem.<\/li>\n<li>A mo\u017ce, gdy pr\u00f3bujesz aktywowa\u0107 wtyczk\u0119, strona od\u015bwie\u017ca si\u0119, ale wtyczka si\u0119 nie aktywuje.<\/li>\n<li>By\u0107 mo\u017ce wykona\u0142e\u015b nawet audyt kodu i widzisz sprawdzanie class_exists w ca\u0142ej bazie kodu.<\/li>\n<\/ul>\n<p>Dowolne lub wszystkie z powy\u017cszych mog\u0105 oczywi\u015bcie przyczyni\u0107 si\u0119 do problem\u00f3w z projektami WordPress. Ale przestrzenie nazw mog\u0105 naprawd\u0119 naprawi\u0107 wiele z tych problem\u00f3w w wi\u0119kszo\u015bci przypadk\u00f3w.<\/p>\n<p>Oznacza to, \u017ce przyczyn\u0105 tych problem\u00f3w jest to, \u017ce kod, z kt\u00f3rym pracujesz, jest w ca\u0142o\u015bci cz\u0119\u015bci\u0105 globalnej przestrzeni nazw (w przeciwie\u0144stwie do jej przestrzeni nazw) a PHP nie lubi kiedy istniej\u0105 klasy i modu\u0142y o tej samej nazwie .<\/p>\n<p>Ale kiedy tworzysz co\u015b w przestrzeni nazw, dajesz mu jej obszar wzgl\u0119dem siebie, kt\u00f3ry nadal b\u0119dzie \u0142adnie wsp\u00f3\u0142pracowa\u0142 z innymi komponentami, nawet je\u015bli maj\u0105 t\u0119 sam\u0105 nazw\u0119 klasy.<\/p>\n<h5>Autoloadery<\/h5>\n<p>Je\u015bli chodzi o automaty \u0142aduj\u0105ce, s\u0105 one pod pewnymi wzgl\u0119dami mniej skomplikowane. Najpierw pomy\u015bl o kodzie, kt\u00f3ry piszesz lub o kodzie, z kt\u00f3rym pracujesz \u2013 zw\u0142aszcza w kontek\u015bcie wtyczek WordPress \u2013 a nast\u0119pnie zastan\u00f3w si\u0119, ile razy piszesz lub widzisz nast\u0119puj\u0105ce rzeczy:<\/p>\n<ul>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.include.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">w\u0142\u0105cza\u0107<\/a><\/li>\n<li>include_raz<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.require.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wymaga\u0107<\/a><\/li>\n<li>wymagaj\u0105 raz<\/li>\n<\/ul>\n<p>Czasami widzisz je na g\u00f3rze pliku, kt\u00f3ry uruchamia wtyczk\u0119, a czasami widzisz je porozrzucane po ca\u0142ym kodzie.<\/p>\n<p>Je\u015bli wszystkie s\u0105 zawarte w jednym pliku, nie jest tak \u017ale, poniewa\u017c przynajmniej wiesz, gdzie si\u0119 znajduj\u0105. Ale je\u015bli s\u0105 za\u015bmiecone wsz\u0119dzie, to nie masz poj\u0119cia, gdzie do systemu wprowadza si\u0119 zale\u017cno\u015b\u0107.<\/p>\n<p>Automatyczne \u0142adowanie mo\u017ce rozwi\u0105za\u0107 ten problem, \u0142aduj\u0105c zale\u017cno\u015bci w razie potrzeby (a dla tych, kt\u00f3rzy s\u0105 zainteresowani, automatyczne \u0142adowanie jest szybsze ni\u017c r\u0119czne w\u0142\u0105czenie).<\/p>\n<h2>Przestrzenie nazw<\/h2>\n<p>Maj\u0105c to wszystko na uwadze, jeste\u015bmy gotowi porozmawia\u0107 o <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">przestrzeniach nazw<\/a> i automatycznym \u0142adowaniu. Ale przestrzenie nazw to podstawowa koncepcja, wi\u0119c od tego zaczniemy.<\/p>\n<p>Ale po tym wszystkim mo\u017cesz zobaczy\u0107 zalety ich u\u017cywania. Mo\u017ce nawet s\u0105 zabawne, prawda? Mo\u017ce?<\/p>\n<p>Niezale\u017cnie od tego potrzebujemy definicji, nad kt\u00f3r\u0105 mo\u017cemy pracowa\u0107, omawiaj\u0105c to do ko\u0144ca artyku\u0142u.<\/p>\n<p>Podr\u0119cznik PHP <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.rationale.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">zawiera nast\u0119puj\u0105c\u0105 definicj\u0119<\/a> :<\/p>\n<blockquote>\n<p>Przestrzenie nazw maj\u0105 na celu rozwi\u0105zanie dw\u00f3ch problem\u00f3w, kt\u00f3re napotykaj\u0105 autorzy bibliotek i aplikacji podczas tworzenia element\u00f3w kodu wielokrotnego u\u017cytku, takich jak klasy lub funkcje\u2026<\/p>\n<\/blockquote>\n<p>I to nie jest z\u0142e, ale jest do\u015b\u0107 d\u0142ugie, techniczne i mo\u017ce by\u0107 troch\u0119 za du\u017co dla tych, kt\u00f3rzy dopiero zaczynaj\u0105. Wi\u0119c upro\u015b\u0107my to troch\u0119 w tym artykule:<\/p>\n<p>Mo\u017ce troch\u0119 lepiej?<\/p>\n<blockquote>\n<p>Spos\u00f3b grupowania powi\u0105zanych klas i interfejs\u00f3w o podobnym przeznaczeniu.<\/p>\n<\/blockquote>\n<p>W tym wyst\u0105pieniu nie b\u0119d\u0119 m\u00f3wi\u0142 o interfejsach; wiem jednak, \u017ce u\u017cywaj\u0105 ich \u015bredniozaawansowani programi\u015bci zorientowani obiektowo, wi\u0119c chcia\u0142em si\u0119 upewni\u0107, \u017ce przynajmniej o nich wspomnia\u0142em.<\/p>\n<h3>Praktyczny przyk\u0142ad<\/h3>\n<p>Nie lubi\u0119 przyk\u0142ad\u00f3w programowania, kt\u00f3re nie daj\u0105 rzeczywistych lub praktycznych zastosowa\u0144. Cz\u0119sto otrzymujemy przyk\u0142ady rzeczy, kt\u00f3rych nigdy by\u015bmy nie skodyfikowali.<\/p>\n<p>Ile razy czyta\u0142e\u015b artyku\u0142 zorientowany obiektowo i podaje on przyk\u0142ad klasy zwierz\u0105t lub klasy samochodu? Nie b\u0119dziemy programowa\u0107 samochodu.<\/p>\n<p>Bardziej prawdopodobne jest, \u017ce b\u0119dziemy pracowa\u0107 z plikami. Przyjrzymy si\u0119 wi\u0119c zestawowi klas odpowiedzialnych za odczytywanie i zapisywanie plik\u00f3w. To znaczy, byli\u015bmy dobrymi programistami zorientowanymi obiektowo i rozdzielili\u015bmy nasze klasy w oparciu o obowi\u0105zki, kt\u00f3re utrzymuj\u0105.<\/p>\n<p>I tak, mo\u017cesz mie\u0107 interfejsy; jednak wykraczaj\u0105 one poza zakres tego artyku\u0142u, wi\u0119c nie zostan\u0105 uwzgl\u0119dnione.<\/p>\n<p>Wi\u0119c dla naszego FileReadera, by\u0107 mo\u017ce podstawy tej klasy wygl\u0105daj\u0105 tak:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1413b1bb.jpg\" 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-167194-61e7a1413b1bb.jpg\" alt=\"Przestrzenie nazw i automatyczne \u0142adowanie w WordPress\" ><\/a><\/p>\n<p>Klasa do czytania plik\u00f3w.<\/p>\n<p>Zauwa\u017c, \u017ce funkcja akceptuje nazw\u0119 pliku, kt\u00f3ry powinna otworzy\u0107 do odczytu. Sprawdzanie b\u0142\u0119d\u00f3w, spos\u00f3b, w jaki odczytuje plik i co zwraca, jest pozostawione implementacji klasy.<\/p>\n<p>A dla FileWriter mamy co\u015b takiego:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a143c699f.jpg\" 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-167194-61e7a143c699f.jpg\" alt=\"Przestrzenie nazw i automatyczne \u0142adowanie w WordPress\" ><\/a><\/p>\n<p>Klasa do zapisywania plik\u00f3w.<\/p>\n<p>Z drugiej strony ta klasa akceptuje informacje, kt\u00f3re zamierza zapisa\u0107 na dysku i nazw\u0119 pliku, do kt\u00f3rego powinna zosta\u0107 zapisana.<\/p>\n<p>Ponownie, tak jak w powy\u017cszym przyk\u0142adzie, nie obejmuje sprawdzania b\u0142\u0119d\u00f3w, zapisywania poprzez zas\u00f3b, zamykania zasob\u00f3w i tak dalej.<\/p>\n<p>Ale tu nie chodzi o prac\u0119 z plikami. Zamiast tego chodzi o pokazanie, jak utworzy\u0107 przestrze\u0144 nazw w kodzie, a te dwa przyk\u0142ady maj\u0105 by\u0107 do tego fundamentalne.<\/p>\n<h3>Uwagi dotycz\u0105ce przestrzeni nazw<\/h3>\n<p>Istnieje zastrze\u017cenie dotycz\u0105ce tego, co widzisz na obrazach przyk\u0142adowego kodu powy\u017cej: te klasy nie maj\u0105 przestrzeni nazw. To znaczy, \u017ce znajduj\u0105 si\u0119 w globalnej przestrzeni nazw, co sprawia, \u017ce \u200b\u200bs\u0105 gotowe do konflikt\u00f3w z innymi klasami.<\/p>\n<p>Sp\u00f3jrz na to w ten spos\u00f3b: wyobra\u017a sobie, \u017ce pakujesz ten kod do wtyczki dla kogo\u015b innego, a nast\u0119pnie \u0142adujesz inn\u0105 wtyczk\u0119, kt\u00f3ra r\u00f3wnie\u017c ma funkcj\u0119 FileReader lub FileWriter. Poniewa\u017c to wszystko b\u0119dzie cz\u0119\u015bci\u0105 tej samej <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.global.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">globalnej przestrzeni nazw<\/a>, b\u0119dziesz musia\u0142 zmierzy\u0107 si\u0119 z konfliktem.<\/p>\n<p>Pami\u0119ta\u0107:<\/p>\n<blockquote>\n<p>Przestrzenie nazw to spos\u00f3b na grupowanie powi\u0105zanych klas i interfejs\u00f3w o podobnym przeznaczeniu.<\/p>\n<\/blockquote>\n<p>We\u017amy wi\u0119c klasy i przestrze\u0144 nazw kod.<\/p>\n<p>Najpierw udost\u0119pnimy przestrze\u0144 nazw najwy\u017cszego poziomu, w kt\u00f3rej b\u0119d\u0105 znajdowa\u0107 si\u0119 te klasy i wszystkie inne; wtedy dostarczymy podpakiet (lub podprzestrze\u0144 nazw lub podprzestrze\u0144, jak s\u0142ysza\u0142em, jak je nazywano), w kt\u00f3rym b\u0119d\u0105 rezydowa\u0107 te klasy plik\u00f3w.<\/p>\n<p>Oznacza to, \u017ce nasz FileReader b\u0119dzie teraz wygl\u0105da\u0142 tak:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a146586f4.jpg\" 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-167194-61e7a146586f4.jpg\" alt=\"Przestrzenie nazw i automatyczne \u0142adowanie w WordPress\" ><\/a><\/p>\n<p>Klasa przestrzeni nazw do odczytywania plik\u00f3w.<\/p>\n<p>A nasz FileWriter b\u0119dzie teraz wygl\u0105da\u0142 tak:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1487e5b2.jpg\" 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-167194-61e7a1487e5b2.jpg\" alt=\"Przestrzenie nazw i automatyczne \u0142adowanie w WordPress\" ><\/a><\/p>\n<p>Klasa przestrzeni nazw do zapisywania plik\u00f3w.<\/p>\n<p>Po pierwsze, mo\u017cesz zobaczy\u0107, \u017ce u\u017cywanie przestrzeni nazw jest \u0142atwe: po prostu u\u017cywasz s\u0142owa kluczowego namespace, a nast\u0119pnie deklarujesz przestrze\u0144 nazw (kt\u00f3ra mo\u017ce r\u00f3wnie dobrze by\u0107 WCATL) na g\u00f3rze z nast\u0119puj\u0105cymi podpakietami.<\/p>\n<p>Ale to prowadzi do innych temat\u00f3w \u2013 a mianowicie dotycz\u0105cych organizacji plik\u00f3w, tworzenia instancji i automatycznego \u0142adowania \u2013 z kt\u00f3rych wszystkie s\u0105 warte om\u00f3wienia.<\/p>\n<h3>W organizacji plik\u00f3w<\/h3>\n<p>W tym momencie wa\u017cne jest, aby mie\u0107 s\u0142owo na temat organizacji plik\u00f3w. W zale\u017cno\u015bci od tego, z kim rozmawiasz, przekonasz si\u0119, \u017ce niekt\u00f3rzy programi\u015bci \u2013 niespodzianka, niespodzianka \u2013 maj\u0105 opini\u0119 na temat tego, jak powinny by\u0107 zorganizowane pliki (i ja nie jestem inny).<\/p>\n<p>Z jednej strony nie musisz w og\u00f3le organizowa\u0107 swoich plik\u00f3w. W rzeczywisto\u015bci mo\u017cesz wrzuci\u0107 ka\u017cd\u0105 rzecz do katalogu g\u0142\u00f3wnego projektu, umie\u015bci\u0107 informacje w przestrzeni nazw i by\u0107 gotowym do pracy.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14ab117d.jpg\" 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-167194-61e7a14ab117d.jpg\" alt=\"Przestrzenie nazw i automatyczne \u0142adowanie w WordPress\" ><\/a><\/p>\n<p>Niezorganizowane pliki<\/p>\n<p>Powy\u017cszy zestaw plik\u00f3w dotyczy ma\u0142ego projektu, wi\u0119c mo\u017cesz sobie wyobrazi\u0107, ile plik\u00f3w istnia\u0142oby dla du\u017cego projektu.<\/p>\n<p>Ale kiedy masz swoje pliki zorganizowane w ten spos\u00f3b, mo\u017ce to utrudni\u0107 pisanie autoloadera, poniewa\u017c autoloader musi wiedzie\u0107, gdzie znale\u017a\u0107 pliki na podstawie ich przestrzeni nazw.<\/p>\n<p>Tutaj w gr\u0119 wchodz\u0105 terminy \u201eorganizacja logiczna&#8221; i \u201eorganizacja wirtualna&#8221;.<\/p>\n<ul>\n<li>Organizacja logiczna odnosi si\u0119 do tego, jak pliki s\u0105 zorganizowane na dysku, tak jak to wida\u0107 powy\u017cej. S\u0105 one logicznie zlokalizowane w katalogu g\u0142\u00f3wnym.<\/li>\n<li>Organizacja wirtualna odnosi si\u0119 do sposobu organizacji plik\u00f3w w odniesieniu do ich przestrzeni nazw. Oznacza to, \u017ce istniej\u0105 katalogi i podkatalogi, kt\u00f3re s\u0105 mapowane na przestrzenie nazw, podpakiety i tak dalej.<\/li>\n<\/ul>\n<p>Wi\u0119c gdyby\u015b wzi\u0105\u0142 powy\u017cszy projekt, jego przestrzenie nazw, jego podpakiety, a nast\u0119pnie uporz\u0105dkowa\u0142 je logicznie i wirtualnie, wygl\u0105da\u0142by to mniej wi\u0119cej tak:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14d9a198.jpg\" 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-167194-61e7a14d9a198.jpg\" alt=\"Przestrzenie nazw i automatyczne \u0142adowanie w WordPress\" ><\/a><\/p>\n<p>Przestrzenie nazw i automatyczne \u0142adowanie: zorganizowane pliki<\/p>\n<p>I chocia\u017c mo\u017cesz zdecydowa\u0107 si\u0119 na organizowanie plik\u00f3w w dowolny spos\u00f3b, jestem fanem upewniania si\u0119, \u017ce istnieje r\u00f3wno\u015b\u0107 mi\u0119dzy nimi. Oznacza to, \u017ce podoba mi si\u0119 moja logiczna i wirtualna organizacja, jak wida\u0107 na powy\u017cszym obrazku.<\/p>\n<p>Gdy przejd\u0119 do omawiania automatycznego \u0142adowania, zobaczysz, dlaczego ma to znaczenie.<\/p>\n<h2>Uwagi dotycz\u0105ce przestrzeni nazw<\/h2>\n<p>Co si\u0119 jednak dzieje, gdy musimy tworzy\u0107 instancje klas, kt\u00f3re s\u0105 w przestrzeni nazw? Gdy klasy nie maj\u0105 przestrzeni nazw, \u0142atwo jest u\u017cy\u0107 s\u0142owa kluczowego \u201enew&#8221;.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14f8414e.jpg\" 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-167194-61e7a14f8414e.jpg\" alt=\"Przestrzenie nazw i automatyczne \u0142adowanie w WordPress\" ><\/a><\/p>\n<p>Instancja bez przestrzeni nazw.<\/p>\n<p>Ale musimy utworzy\u0107 instancj\u0119 klasy z przestrzeni\u0105 nazw, musimy p\u00f3j\u015b\u0107 o krok dalej i u\u017cy\u0107 w pe\u0142ni kwalifikowanej nazwy:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1519c7ff.jpg\" 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-167194-61e7a1519c7ff.jpg\" alt=\"Przestrzenie nazw i automatyczne \u0142adowanie w WordPress\" ><\/a><\/p>\n<p>Przestrzenie nazw i automatyczne \u0142adowanie: tworzenie wyst\u0105pie\u0144 z przestrzeni\u0105 nazw.<\/p>\n<p>Ale to staje si\u0119 k\u0142opotliwe, prawda? Ten konkretny przyk\u0142ad nie jest taki z\u0142y, ale wyobra\u017a sobie, \u017ce pracujesz nad czym\u015b z wi\u0119ksz\u0105 liczb\u0105 podpakiet\u00f3w. By\u0142oby to do\u015b\u0107 k\u0142opotliwe, prawda?<\/p>\n<p>W tym celu mo\u017cemy u\u017cy\u0107 tzw. aliasingu. To te\u017c jest proste. Mo\u017cemy zdefiniowa\u0107 u\u017cycie s\u0142owa kluczowego 'use&#8217; na g\u00f3rze pliku, aby odwo\u0142a\u0107 si\u0119 do przestrzeni nazw, kt\u00f3r\u0105 chcemy aliasowa\u0107, a nast\u0119pnie u\u017cy\u0107 ostatniego podpakietu jako cz\u0119\u015bci aliasu, aby utworzy\u0107 instancj\u0119 naszej klasy.<\/p>\n<p>Brzmi myl\u0105c, prawda? By\u0107 mo\u017ce zobaczenie tego w akcji pomo\u017ce:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1541531b.jpg\" 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-167194-61e7a1541531b.jpg\" alt=\"Przestrzenie nazw i automatyczne \u0142adowanie w WordPress\" ><\/a><\/p>\n<p>Aliasy przestrzeni nazw.<\/p>\n<p>I to wszystko. Tak, mo\u017cesz <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.importing.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">p\u00f3j\u015b\u0107 o krok dalej w aliasie<\/a>, ale na tym polegam w kontek\u015bcie tego artyku\u0142u.<\/p>\n<h2>Automatyczne \u0142adowanie<\/h2>\n<p>W tym momencie mamy ju\u017c przygotowane podstawy do automatycznego \u0142adowania. Tak, praca z przestrzeniami nazw mo\u017ce by\u0107 bardzo pracoch\u0142onna, je\u015bli nie jeste\u015b do tego przyzwyczajony; jednak wa\u017cne jest, aby zrozumie\u0107, poniewa\u017c automatyczne \u0142adowanie wymaga troch\u0119 pracy, kt\u00f3ra mo\u017ce by\u0107 nieoczekiwana, je\u015bli nigdy wcze\u015bniej nie by\u0142e\u015b z tym zapoznany.<\/p>\n<p>Niezale\u017cnie od tego, najwa\u017cniejsze rzeczy do zapami\u0119tania dotycz\u0105ce przestrzeni nazw w tym momencie to:<\/p>\n<ol>\n<li>Przestrzenie nazw to spos\u00f3b na grupowanie powi\u0105zanych klas i interfejs\u00f3w o podobnym przeznaczeniu.<\/li>\n<li>Utw\u00f3rz parzysto\u015b\u0107 w plikach i przestrzeniach nazw, upewniaj\u0105c si\u0119, \u017ce Twoja logiczna i wirtualna organizacja s\u0105 takie same.<\/li>\n<\/ol>\n<p>A teraz nadszed\u0142 czas, aby przyjrze\u0107 si\u0119 automatycznemu \u0142adowaniu.<\/p>\n<h3>Uwagi dotycz\u0105ce automatycznego \u0142adowania<\/h3>\n<p>Najpierw sp\u00f3jrzmy na definicj\u0119 automatycznego \u0142adowania podan\u0105 <a href=\"https:\/\/php.net\/manual\/en\/language.oop5.autoload.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">w podr\u0119czniku PHP<\/a> :<\/p>\n<blockquote>\n<p>Funkcja spl_autoload_register() rejestruje dowoln\u0105 liczb\u0119 autoloader\u00f3w, umo\u017cliwiaj\u0105c automatyczne \u0142adowanie klas i interfejs\u00f3w, je\u015bli nie s\u0105 one aktualnie zdefiniowane. Rejestruj\u0105c autoloadery, PHP otrzymuje ostatni\u0105 szans\u0119 na za\u0142adowanie klasy lub interfejsu, zanim zawiedzie z powodu b\u0142\u0119du.<\/p>\n<\/blockquote>\n<p>Nie jest \u017ale. Jednak to jest d\u0142ugie. Tak jak w przypadku przestrzeni nazw, u\u017cyjmy kr\u00f3tszej definicji w tym artykule:<\/p>\n<blockquote>\n<p>Spos\u00f3b na automatyczne \u0142adowanie interfejs\u00f3w i klas bez u\u017cycia instrukcji include i require.<\/p>\n<\/blockquote>\n<p>Ponownie, nie b\u0119dziemy u\u017cywa\u0107 interfejs\u00f3w w tym artykule, chocia\u017c niekt\u00f3rzy programi\u015bci to robi\u0105. I to b\u0119dzie stanowi\u0107 robocz\u0105 definicj\u0119 pozosta\u0142ej cz\u0119\u015bci tego artyku\u0142u.<\/p>\n<h3>Praktyczny przyk\u0142ad<\/h3>\n<p>Po uporz\u0105dkowaniu plik\u00f3w, przestrzeni nazw i gotowo\u015bci do za\u0142adowania nadszed\u0142 czas, aby to zrobi\u0107, prawda? To znaczy:<\/p>\n<ol>\n<li>twoje pliki s\u0105 uporz\u0105dkowane,<\/li>\n<li>jeste\u015b gotowy, aby je za\u0142adowa\u0107<\/li>\n<\/ol>\n<p>Wi\u0119c czas zrobi\u0107 to automatycznie, prawda? Ale jest pewien haczyk. Ca\u0142e \u201eautomatyczne \u0142adowanie&#8221; plik\u00f3w wymaga troch\u0119 pracy.<\/p>\n<h3>Pisanie Autoloadera<\/h3>\n<p>Oznacza to, \u017ce jest to automatyczne, ale nadal wymaga troch\u0119 wi\u0119cej pracy z naszej strony. Zanim przejdziesz do tych krok\u00f3w, wa\u017cne jest, aby pami\u0119ta\u0107:<\/p>\n<ol>\n<li>nie jest w pe\u0142ni zautomatyzowany,<\/li>\n<li>musimy to napisa\u0107.<\/li>\n<\/ol>\n<p>Cho\u0107 by\u0142oby to mi\u0142e, gdyby kod by\u0142 automatycznie \u0142adowany, musimy odczyta\u0107 pewne dane, przeanalizowa\u0107 je, a nast\u0119pnie spr\u00f3bowa\u0107 za\u0142adowa\u0107 odpowiedni plik.<\/p>\n<p>Ale zak\u0142adaj\u0105c, \u017ce napiszesz to poprawnie, swoj\u0105 przestrze\u0144 nazw i zorganizujesz swoje pliki w ten sam spos\u00f3b dla ka\u017cdego projektu, mo\u017cesz ponownie u\u017cy\u0107 swojego autoloadera. Oznacza to, \u017ce piszesz go raz i mo\u017cesz go u\u017cywa\u0107 w innych projektach.<\/p>\n<h3>Kroki dla autoloadera<\/h3>\n<p>Podczas pisania autoloadera nale\u017cy wykona\u0107 tylko kilka krok\u00f3w. Autoloader musi by\u0107 w stanie odpowiedzie\u0107 na nast\u0119puj\u0105ce pliki:<\/p>\n<ol>\n<li>Gdzie s\u0105 pliki?<\/li>\n<li>Jak si\u0119 nazywaj\u0105?<\/li>\n<li>Czy plik istnieje?<\/li>\n<\/ol>\n<p>Je\u015bli wszystkie powy\u017csze s\u0105 prawdziwe (lub mo\u017cesz odpowiedzie\u0107 \u201etak&#8221; na wszystkie), to autoloader zrobi to, co powinien.<\/p>\n<p>Za chwil\u0119 przyjrzymy si\u0119 kodowi, ale pierwsz\u0105 rzecz\u0105, na kt\u00f3r\u0105 nale\u017cy zwr\u00f3ci\u0107 uwag\u0119, jest to, \u017ce u\u017cywa on funkcji o nazwie spl_autoload_register.<\/p>\n<p>SPL odnosi si\u0119 do <a href=\"https:\/\/php.net\/manual\/en\/book.spl.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Standardowej Biblioteki PHP<\/a>, a funkcja akceptuje funkcj\u0119 jako argument, a ta funkcja przyjmuje nazw\u0119 klasy, kt\u00f3ra ma zosta\u0107 utworzona. Jest bardziej proceduralny ni\u017c obiektowy i powiem o tym za chwil\u0119, ale wa\u017cne jest, aby pami\u0119ta\u0107 podczas czytania tego kodu.<\/p>\n<p>Oto pierwsza cz\u0119\u015b\u0107 kodu. Wyja\u015bni\u0119, co robi po fakcie:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1562a1b8.jpg\" 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-167194-61e7a1562a1b8.jpg\" alt=\"Przestrzenie nazw i automatyczne \u0142adowanie w WordPress\" ><\/a><\/p>\n<p>Automatyczne \u0142adowanie, cz\u0119\u015b\u0107 1 \u2013 Znajdowanie klasy<\/p>\n<p>W tej cz\u0119\u015bci kodu funkcja otrzymuje w pe\u0142ni kwalifikowan\u0105 nazw\u0119 klasy, kt\u00f3ra ma zosta\u0107 utworzona (np. \u201eWCATLFileFileReader()&#8221;).<\/p>\n<p>Nast\u0119pnie rozdziela wszystkie cz\u0119\u015bci w pe\u0142ni kwalifikowanej nazwy na cz\u0119\u015bci. Nazwa klasy jest ostatnim indeksem tablicy, a ja decyduj\u0119 si\u0119 nazwa\u0107 moje pliki \u201eclass-filereader.php&#8221;, aby funkcja tworzy\u0142a zmienn\u0105 $class_file, kt\u00f3ra odnosi si\u0119 do nazwy pliku.<\/p>\n<p>Ale jeszcze nie sko\u0144czyli\u015bmy. Nadal musimy uzyska\u0107 w pe\u0142ni kwalifikowan\u0105 nazw\u0119 (czyli miejsce, w kt\u00f3rym plik znajduje si\u0119 na dysku). To mo\u017ce wygl\u0105da\u0107 mniej wi\u0119cej tak:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a15910c7c.jpg\" 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-167194-61e7a15910c7c.jpg\" alt=\"Przestrzenie nazw i automatyczne \u0142adowanie w WordPress\" ><\/a><\/p>\n<p>Automatyczne \u0142adowanie, cz\u0119\u015b\u0107 2 \u2013 Uzyskanie w pe\u0142ni kwalifikowanej nazwy<\/p>\n<p>W tym momencie przygotowujemy zmienn\u0105 $full_qualified_path, kt\u00f3ra b\u0119dzie odnosi\u0107 si\u0119 do katalogu najwy\u017cszego poziomu.<\/p>\n<p>Nast\u0119pnie kod przechodzi przez wszystkie indeksy tablicy i tworzy \u015bcie\u017ck\u0119 do pliku klasy. Mo\u017cesz sobie to wyobrazi\u0107 jako budowanie ci\u0105gu, takiego jak \u201ewcatlfile&#8221;, kt\u00f3ry nast\u0119pnie \u0142\u0105czymy z $class_file.<\/p>\n<p>Oznacza to, \u017ce w pe\u0142ni kwalifikowana \u015bcie\u017cka do pliku staje si\u0119 \u201ewcatlfileclass-filereader.php&#8221;.<\/p>\n<p>I na koniec do\u0142\u0105czamy plik. Zauwa\u017c, \u017ce ten kod nie sprawdza, czy plik istnieje. Chocia\u017c polecam, zosta\u0142 pomini\u0119ty ze wzgl\u0119du na d\u0142ugo\u015b\u0107 i poniewa\u017c w naszym przyk\u0142adzie wiemy, \u017ce plik istnieje.<\/p>\n<p>Je\u015bli plik nie istnieje, istnieje kilka opcji:<\/p>\n<ol>\n<li>Zrzu\u0107 wyj\u0105tek,<\/li>\n<li>Z\u0142ap wyj\u0105tek,<\/li>\n<li>Wy\u015bwietl w\u0142asny komunikat o b\u0142\u0119dzie,<\/li>\n<li>Lub jaka\u015b inna opcja, kt\u00f3r\u0105 rozwa\u017cam w tym artykule.<\/li>\n<\/ol>\n<p>Niezale\u017cnie od tego, chodzi o to, aby w kodzie dzia\u0142a\u0107 defensywnie, aby m\u00f3c przygotowa\u0107 si\u0119 na przypadek, \u017ce plik nie istnieje i z wdzi\u0119kiem poradzi\u0107 sobie z awari\u0105.<\/p>\n<h3>Po automatycznym \u0142adowaniu<\/h3>\n<p>Przed zako\u0144czeniem warto zwr\u00f3ci\u0107 uwag\u0119 na nast\u0119puj\u0105ce kwestie:<\/p>\n<ul>\n<li>W ca\u0142ym przyk\u0142adzie u\u017cywali\u015bmy kodu zorientowanego obiektowo podczas tworzenia przestrzeni nazw kodu. W ko\u0144cu jest to koncepcja zorientowana obiektowo.<\/li>\n<li>Nasz autoloader jest napisany w kodzie proceduralnym. Co daje?<\/li>\n<\/ul>\n<p>Ostatecznie ma to zwi\u0105zek ze standardow\u0105 bibliotek\u0105 PHP. Mo\u017cesz napisa\u0107 autoloader zorientowany obiektowo, ale my\u015bl\u0119, \u017ce w wielu przypadkach jest to troch\u0119 przesada.<\/p>\n<p>Proces \u0142adowania pliku jest procesem krok po kroku, wi\u0119c pisanie go w spos\u00f3b proceduralny jest naturalnym rozwi\u0105zaniem.<\/p>\n<p>Wreszcie, inni mog\u0105 zdecydowa\u0107 si\u0119 na u\u017cycie narz\u0119dzi takich jak Composer, aby wprowadzi\u0107 zale\u017cno\u015bci. To \u015bwietne narz\u0119dzia, a u\u017cywanie czego\u015b takiego ma wiele zalet; jednak wykracza to poza koncepcje i tematy zawarte w tym artykule i najlepiej pozostawi\u0107 je na przysz\u0142\u0105 rozmow\u0119.<\/p>\n<h2>Zasoby (i dzi\u0119kuj\u0119!)<\/h2>\n<p>To by\u0142 jeden z najd\u0142u\u017cszych artyku\u0142\u00f3w, jakie napisa\u0142em dla mojej witryny.<\/p>\n<p>Dzieje si\u0119 tak cz\u0119\u015bciowo dlatego, \u017ce opiera si\u0119 na rozmowie dla WordCamp, a tak\u017ce dlatego, \u017ce chc\u0119 si\u0119 upewni\u0107, \u017ce zapewni\u0119 solidne wprowadzenie i podstaw\u0119, od kt\u00f3rej mo\u017cesz zacz\u0105\u0107 w\u0142\u0105cza\u0107 przestrzenie nazw i automatyczne \u0142adowanie do wtyczek WordPress.<\/p>\n<p>Opr\u00f3cz tego artyku\u0142u udost\u0119pni\u0142em r\u00f3wnie\u017c nast\u0119puj\u0105ce zasoby:<\/p>\n<ul>\n<li>Slajdy mojej prezentacji s\u0105 <a href=\"https:\/\/speakerdeck.com\/tommcfarlin\/namespaces-and-autoloading-improving-wordpress-plugin-architecture\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dost\u0119pne na SpeakerDeck<\/a>.<\/li>\n<li>Mam kod z tej prezentacji <a href=\"https:\/\/github.com\/tommcfarlin\/namespaces-and-autoloading-in-wordpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">do pobrania na GitHub<\/a>.<\/li>\n<\/ul>\n<p>I z tym mam nadziej\u0119, \u017ce jest to solidne wprowadzenie do przestrzeni nazw i automatycznego \u0142adowania i \u017ce b\u0119dziesz w stanie zacz\u0105\u0107 w\u0142\u0105cza\u0107 to coraz bardziej do swojej pracy. To bardzo przyniesie korzy\u015bci Twojej pracy i innym programistom, kt\u00f3rzy mog\u0105 r\u00f3wnie\u017c skorzysta\u0107 z Twojej pracy.<\/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>Na podstawie mojego wyst\u0105pienia na WordCamp Atlanta 2017, jest to m\u00f3j obszerny artyku\u0142 na temat przestrzeni nazw i automatycznego \u0142adowania w programowaniu WordPress.<\/p>\n","protected":false},"author":1,"featured_media":221177,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,845,866],"tags":[1169],"class_list":["post-228654","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228654","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=228654"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228654\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/221177"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=228654"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=228654"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=228654"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}