{"id":229495,"date":"2022-11-21T17:37:00","date_gmt":"2022-11-21T14:37:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229495"},"modified":"2022-11-21T17:37:02","modified_gmt":"2022-11-21T14:37:02","slug":"drugie-dwa-filary-oop","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/drugie-dwa-filary-oop\/","title":{"rendered":"Drugie dwa filary OOP"},"content":{"rendered":"\n<p>Jak wspomnia\u0142em w <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/pierwsze-dwa-filary-oop\/\" title=\"pierwszym po\u015bcie z tej serii\">pierwszym po\u015bcie z tej serii<\/a><\/strong>, cz\u0119sto b\u0119dziesz s\u0142ysza\u0142 o Trzech Filarach Programowania Obiektowego. Mo\u017cesz tak\u017ce us\u0142ysze\u0107 o czterech filarach programowania obiektowego.<\/p>\n<p>I nie chodzi o to, \u017ce jest ich w sumie siedem czy co\u015b takiego. Zamiast tego chodzi bardziej o to, co ludzie uwa\u017caj\u0105 za fundamentalne dla OOP: Czy istniej\u0105 trzy lub cztery g\u0142\u00f3wne koncepcje?<\/p>\n<p>Jak mo\u017cna si\u0119 domy\u015bli\u0107 z poprzedniego artyku\u0142u (nie m\u00f3wi\u0105c ju\u017c o tytule), uwa\u017cam, \u017ce s\u0105 cztery.<\/p>\n<p>A w tym po\u015bcie om\u00f3wi\u0119 dwie ostatnie:<\/p>\n<ul>\n<li>Dziedzictwo,<\/li>\n<li>i polimorfizm<\/li>\n<\/ul>\n<p>Je\u015bli przed przeczytaniem tego artyku\u0142u wykonywa\u0142e\u015b programowanie obiektowe, prawdopodobnie s\u0142ysza\u0142e\u015b o co najmniej jednym z nich.<\/p>\n<p>Niezale\u017cnie od tego przyjrzyjmy si\u0119 ka\u017cdemu z nich bardziej szczeg\u00f3\u0142owo.<\/p>\n<h2>Dwa kolejne filary OOP<\/h2>\n<p>Zanim wskocz\u0119 do ka\u017cdego z nich, chc\u0119 si\u0119 upewni\u0107, \u017ce jeste\u015b uwik\u0142any w to, co do tej pory om\u00f3wili\u015bmy.<\/p>\n<h3>S\u0142owo o analizie<\/h3>\n<p>Nie b\u0119d\u0119 omawia\u0142 tego tematu, ale ca\u0142y pow\u00f3d, dla kt\u00f3rego teraz m\u00f3wi\u0119 o podstawach zorientowanych obiektowo, jest taki, \u017ce przechodzimy do innej fazy tego materia\u0142u. Zacz\u0119li\u015bmy od omawiania fazy <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-analysis\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">analizy<\/a><\/strong>, kt\u00f3ra obejmowa\u0142a:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/programowanie-obiektowe-w-wordpress-analiza-czesc-1\/\" title=\"Analiza, cz\u0119\u015b\u0107 1\">Analiza, cz\u0119\u015b\u0107 1<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/programowanie-obiektowe-w-wordpress-analiza-czesc-2\/\" title=\"Analiza, cz\u0119\u015b\u0107 2\">Analiza, cz\u0119\u015b\u0107 2<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/programowanie-obiektowe-w-wordpress-zrozumienie-oczekiwan-klientow\/\" title=\"Zrozumienie oczekiwa\u0144 klient\u00f3w\">Zrozumienie oczekiwa\u0144 klient\u00f3w<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/programowanie-obiektowe-w-wordpress-zestawienie-pracy\/\" title=\"Zestawienie pracy\">Zestawienie pracy<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/programowanie-obiektowe-w-wordpressie-regulamin\/\" title=\"Zasady i warunki\">Zasady i warunki<\/a><\/li>\n<\/ol>\n<h3>Teraz do rozwoju<\/h3>\n<p>A teraz jeste\u015bmy w fazie <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">rozwoju<\/a><\/strong>. Niekt\u00f3rzy mog\u0105 nazwa\u0107 to podstawami (ale ciesz\u0119 si\u0119, \u017ce nie mo\u017cna zrobi\u0107 dobrego programowania bez podstaw, wi\u0119c jest to (.<\/p>\n<p>Je\u015bli nie czyta\u0142e\u015b <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/pierwsze-dwa-filary-oop\/\" title=\"poprzedniego posta\">poprzedniego posta<\/a><\/strong>, polecam to zrobi\u0107 przed kontynuowaniem, poniewa\u017c omawia on poj\u0119cia abstrakcji, enkapsulacji i ich zwi\u0105zku z WordPress.<\/p>\n<h3>3 Dziedziczenie<\/h3>\n<p>Poj\u0119cie dziedziczenia jest do\u015b\u0107 \u0142atwe do na\u015bladowania. Oznacza to, \u017ce jedna klasa mo\u017ce dziedziczy\u0107 atrybuty innej klasy. Za chwil\u0119 podam kilka przyk\u0142ad\u00f3w, ale pozw\u00f3lcie, \u017ce podam robocz\u0105 definicj\u0119 na potrzeby tego postu:<\/p>\n<blockquote>\n<p>Dziedziczenie odnosi si\u0119 do idei, \u017ce jedna klasa, chocia\u017c ma w\u0142asn\u0105 implementacj\u0119, dos\u0142ownie dziedziczy w\u0142a\u015bciwo\u015bci, funkcje i og\u00f3ln\u0105 implementacj\u0119 z klasy nadrz\u0119dnej.<\/p>\n<\/blockquote>\n<h4>Przyk\u0142ad 1: Dokument<\/h4>\n<p>M\u00f3wi\u0105c bardzo prosto, za\u0142\u00f3\u017cmy, \u017ce masz klas\u0119 o nazwie Document, a dokument ma tytu\u0142 i tre\u015b\u0107. Nast\u0119pnie istnieje podklasa dokumentu, kt\u00f3ra ma atrybuty daty i godziny. Mo\u017cemy nazwa\u0107 to PostDocument lub PageDocument.<\/p>\n<p>Oznacza to, \u017ce PageDocument <strong>dziedziczy<\/strong> w\u0142a\u015bciwo\u015bci i atrybuty Document, jednocze\u015bnie dodaj\u0105c do niego w\u0142asn\u0105 implementacj\u0119. Ma sens?<\/p>\n<p>Je\u015bli nie, nie martw si\u0119. Na pocz\u0105tku nie zawsze \u201eklika&quot;, wi\u0119c sp\u00f3jrzmy na inny przyk\u0142ad.<\/p>\n<h4>Przyk\u0142ad 2: Wiadomo\u015b\u0107<\/h4>\n<p>Powiedzmy, \u017ce mamy klas\u0119 Message. Wiadomo\u015b\u0107 ma zazwyczaj dwie w\u0142a\u015bciwo\u015bci:<\/p>\n<ul>\n<li>1 Nadawca,<\/li>\n<li>2 Odbiorca.<\/li>\n<\/ul>\n<p>Mo\u017cna jednak powiedzie\u0107, \u017ce istniej\u0105 r\u00f3\u017cne rodzaje wiadomo\u015bci, prawda? To znaczy, by\u0107 mo\u017ce mamy wiadomo\u015b\u0107 e-mail, a mo\u017ce mamy wiadomo\u015b\u0107 tekstow\u0105.<\/p>\n<p>Wiadomo\u015b\u0107 e-mail nadal ma nadawc\u0119 i odbiorc\u0119, ale ma o wiele wi\u0119cej, prawda? Ma takie rzeczy jak:<\/p>\n<ul>\n<li>temat,<\/li>\n<li>opcjonalny za\u0142\u0105cznik,<\/li>\n<li>inny zestaw nadawc\u00f3w, do kt\u00f3rych jest wysy\u0142any,<\/li>\n<li>wsparcie dla kopiowania innych do wiadomo\u015bci publicznie lub prywatnie,<\/li>\n<li>i wiele wi\u0119cej.<\/li>\n<\/ul>\n<p>Z drugiej strony TextMessage niekoniecznie b\u0119dzie zawiera\u0142 wszystkie powy\u017csze elementy. Za\u0142\u00f3\u017cmy, \u017ce m\u00f3wimy o podstawowej wiadomo\u015bci SMS (w przeciwie\u0144stwie do bogatej wiadomo\u015bci tekstowej w czym\u015b takim jak Hangouts, Telegram, iMessage lub cokolwiek innego).<\/p>\n<p>Ta klasa b\u0119dzie:<\/p>\n<ul>\n<li>by\u0107 przywi\u0105zanym do numeru telefonu,<\/li>\n<li>mo\u017ce obejmowa\u0107 grup\u0119 innych odbiorc\u00f3w, z kt\u00f3rych wszyscy s\u0105 publiczni,<\/li>\n<li>operator (czyli operator kom\u00f3rkowy),<\/li>\n<li>maksymalna liczba znak\u00f3w, kt\u00f3re mo\u017ce zawiera\u0107<\/li>\n<li>mo\u017cliwo\u015b\u0107 podzielenia pojedynczej wiadomo\u015bci na wiele wiadomo\u015bci, je\u015bli maksymalna liczba znak\u00f3w przekracza okre\u015blon\u0105 liczb\u0119 znak\u00f3w.<\/li>\n<\/ul>\n<p>Ale wci\u0105\u017c rodzi pytania dotycz\u0105ce w\u0142a\u015bciwo\u015bci i metod (lub og\u00f3lniej implementacji, prawda?)<\/p>\n<h4>S\u0142owo o wdro\u017ceniu<\/h4>\n<p>Je\u015bli chodzi o programowanie obiektowe, mamy co\u015b, co nazywamy modyfikatorami dost\u0119pu. By\u0107 mo\u017ce czyta\u0142e\u015b je gdzie indziej jako, powiedzmy, modyfikatory widoczno\u015bci lub co\u015b w tym stylu.<\/p>\n<p>To wszystko jest takie samo.<\/p>\n<p>W skr\u00f3cie te modyfikatory mo\u017cna zdefiniowa\u0107 jako:<\/p>\n<blockquote>\n<p>S\u0142owa kluczowe, kt\u00f3re kontroluj\u0105 dost\u0119p innych klas do dost\u0119pnych informacji.<\/p>\n<\/blockquote>\n<p>Na szcz\u0119\u015bcie ta cz\u0119\u015b\u0107 jest \u0142atwa do zrozumienia:<\/p>\n<ul>\n<li><strong>prywatne<\/strong> w\u0142a\u015bciwo\u015bci i funkcje s\u0105 dost\u0119pne tylko dla klasy, w kt\u00f3rej s\u0105 zdefiniowane. Oznacza to, \u017ce PostDocument nie mo\u017ce u\u017cywa\u0107 w dokumencie niczego, co jest oznaczone jako prywatne. Dla wszystkich intencji i cel\u00f3w PostDocument nie jest nawet \u015bwiadomy, \u017ce te informacje istniej\u0105.<\/li>\n<li><strong>chronione<\/strong> w\u0142a\u015bciwo\u015bci i funkcje s\u0105 dost\u0119pne dla klasy, w kt\u00f3rej s\u0105 zdefiniowane, i ka\u017cdej klasy, kt\u00f3ra jest potomkiem. Oznacza to, \u017ce ka\u017cda klasa, kt\u00f3ra dziedziczy dane z klasy bazowej lub klasy nadrz\u0119dnej, ma do nich dost\u0119p. Tak wi\u0119c, w przeciwie\u0144stwie do <strong>prywatnych<\/strong> szczeg\u00f3\u0142\u00f3w implementacji, PostDocument mo\u017ce uzyska\u0107 dost\u0119p do informacji z dokumentu, je\u015bli jest oznaczony jako chroniony.<\/li>\n<li>w\u0142a\u015bciwo\u015bci i funkcje <strong>publiczne s\u0105 dost\u0119pne dla ka\u017cdego.<\/strong> Tak naprawd\u0119 nie ma to nic wsp\u00f3lnego z dziedziczeniem, ale raczej z enkapsulacj\u0105, je\u015bli w og\u00f3le. Zamiast tego chodzi o decydowanie, do czego chcemy, aby inne obiekty mia\u0142y dost\u0119p.<\/li>\n<\/ul>\n<p>Jak wi\u0119c przebiega wdro\u017cenie? R\u00f3\u017cni si\u0119 to w zale\u017cno\u015bci od j\u0119zyka, ale PHP nie obs\u0142uguje tak zwanego \u201ewielokrotnego dziedziczenia&#8221;. M\u00f3wi\u0105c najpro\u015bciej, dana klasa w <a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP mo\u017ce dziedziczy\u0107 (lub rozszerza\u0107) tylko jedn\u0105 inn\u0105 klas\u0119<\/a>. Nie wiele klas (niekt\u00f3re j\u0119zyki to obs\u0142uguj\u0105).<\/p>\n<blockquote>\n<p>Kiedy rozszerzasz klas\u0119, podklasa dziedziczy wszystkie publiczne i chronione metody z klasy nadrz\u0119dnej. O ile klasa nie zast\u0105pi tych metod, zachowaj\u0105 one swoj\u0105 pierwotn\u0105 funkcjonalno\u015b\u0107.<\/p>\n<\/blockquote>\n<p>W naszym przyk\u0142adzie nie mo\u017cemy wprowadzi\u0107 innej klasy, takiej jak WrittenDocument, kt\u00f3ra dziedziczy zar\u00f3wno po PageDocument, jak i PostDocument. To albo jedno, albo drugie. I warto zauwa\u017cy\u0107, \u017ce je\u015bli dziedziczy z PostDocument, dziedziczy r\u00f3wnie\u017c informacje z Document, poniewa\u017c jest to podklasa podklasy klasy.<\/p>\n<h3>4 Polimorfizm<\/h3>\n<p>Teraz, gdy mamy ju\u017c podstawow\u0105 definicj\u0119 dziedziczenia, mo\u017cemy m\u00f3wi\u0107 o polimorfizmie. Dobr\u0105 wiadomo\u015bci\u0105 jest to, \u017ce jest to du\u017ce, dziwne s\u0142owo na bardzo prost\u0105 koncepcj\u0119.<\/p>\n<p>Z\u0142a wiadomo\u015b\u0107 jest taka, \u017ce \u200b\u200bnie rozmawiali\u015bmy o interfejsach ani klasach abstrakcyjnych. Nadchodz\u0105, ale s\u0105 uwa\u017cane za cz\u0119\u015b\u0107 czterech filar\u00f3w, wi\u0119c nie martw si\u0119 nimi teraz.<\/p>\n<p>Zamiast tego pomy\u015bl o tym w taki spos\u00f3b:<\/p>\n<blockquote>\n<p>Polimorfizm pozwala nam odnosi\u0107 si\u0119 do klasy jednego typu, kiedy mo\u017ce by\u0107 zadeklarowana jako inny typ.<\/p>\n<\/blockquote>\n<p>Nadal mo\u017ce to by\u0107 myl\u0105ce, ale pami\u0119tasz nasz, powiedzmy, przyk\u0142ad wiadomo\u015bci powy\u017cej? Mo\u017cemy utworzy\u0107 instancj\u0119 klasy SMSMessage, kt\u00f3ra <strong>rozszerza<\/strong> klas\u0119 Message, a nast\u0119pnie wywo\u0142a\u0107 na niej okre\u015blone metody.<\/p>\n<p>SMSMessage mo\u017ce mie\u0107 metod\u0119, kt\u00f3r\u0105 ma klasa Message. A je\u015bli klasa zosta\u0142a utworzona jako instancja klasy SMSMessage, wywo\u0142a t\u0119 metod\u0119. Podobnie, je\u015bli nie ma metody, ale ma j\u0105 klasa nadrz\u0119dna Message, to wywo\u0142a t\u0119 metod\u0119.<\/p>\n<p>Czasami naj\u0142atwiej jest to zrozumie\u0107 w kodzie, wi\u0119c zr\u00f3bmy to.<\/p>\n<p>Najpierw zdefiniujmy nasz\u0105 klas\u0119 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-00-message-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Message :<\/a><\/strong><\/p>\n<pre><code>&lt;?php\nclass Message\n{\n  public function send()\n  {\n    echo \"This message is sent from the Message class.n\";\n  }\n\n  public function receive()\n  {\n    echo \"This message was received from the Message class.n\";\n  }\n}\n<\/code><\/pre>\n<p>Nast\u0119pnie zdefiniujmy nasz\u0105 klas\u0119 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-01-smsmessage-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">SMSMessage<\/a>. Zauwa\u017c, \u017ce nie ma funkcji <strong>receive()<\/strong>. To b\u0119dzie wa\u017cne chwilowo:<\/p>\n<pre><code>&lt;?php\nclass SMSMessage extends Message\n{\n  public function send()\n  {\n    echo \"This message is sent from the SMSMessage class.n\";\n  }\n}<\/code><\/pre>\n<p>Teraz <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-02-functionaldemo1-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">stw\u00f3rzmy instancj\u0119 naszej klasy Message<\/a><\/strong> i wywo\u0142ajmy kilka metod:<\/p>\n<pre><code>&lt;?php\n$message = new Message();\n$message-&gt;send();\n$message-&gt;receive();<\/code><\/pre>\n<p>I zr\u00f3bmy to samo <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-03-functionaldemo2-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">za pomoc\u0105 klasy SMSMessage:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n$message = new SMSMessage();\n$message-&gt;send();\n$message-&gt;receive();<\/code><\/pre>\n<p>Je\u015bli chcesz ca\u0142y skrypt, mo\u017cesz go zobaczy\u0107 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-04-workingdemo-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tutaj<\/a><\/strong>, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-04-workingdemo-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pobra\u0107<\/a> i wykona\u0107 lokalnie.<\/p>\n<h2>Dziedziczenie, polimorfizm i WordPress<\/h2>\n<p>Oto wniosek (om\u00f3wimy to bardziej, gdy przejdziemy do interfejs\u00f3w i klas abstrakcyjnych): Kiedy klasa <strong>rozszerza<\/strong> inn\u0105 klas\u0119 i nie ma szczeg\u00f3\u0142\u00f3w implementacji, kt\u00f3re posiada jej klasa nadrz\u0119dna, zostanie u\u017cyta implementacja rodzica.<\/p>\n<p>Innym sposobem my\u015blenia o tym jest \u201eopracowanie \u0142a\u0144cucha dowodzenia&#8221;. Zacznie si\u0119 od klasy najni\u017cszej do tego, co stworzyli\u015bmy. W naszym przyk\u0142adzie powy\u017cej jest to SMSMessage. Je\u015bli go tam nie znajdzie, przeniesie si\u0119 do klasy, kt\u00f3r\u0105 rozszerza. (A je\u015bli go tam nie znajdzie, a ta klasa rozszerzy klas\u0119, spr\u00f3buje tam.)<\/p>\n<p>Ca\u0142a polimorficzna rzecz jest nast\u0119puj\u0105ca: utworzyli\u015bmy instancj\u0119 klasy jednego typu, SMSMessage, ale u\u017cywa ona implementacji klasy innego typu (kt\u00f3ra dziedziczy, tak, ale to jednak inne).<\/p>\n<h3>Pisanie zaj\u0119\u0107 na WordPressie<\/h3>\n<p>Na koniec chcia\u0142bym zostawi\u0107 tobie to: wspomnia\u0142em o czym\u015b podobnym w poprzednim po\u015bcie, ale chc\u0119 to powt\u00f3rzy\u0107 tutaj.<\/p>\n<p>Niezale\u017cnie od tego, ile z tych koncepcji wykorzystuje rdze\u0144 WordPress, nie ma to znaczenia, poniewa\u017c mo\u017cemy na WordPressie pisa\u0107 wysokiej jako\u015bci, obiektowy kod, kt\u00f3ry wsp\u00f3\u0142dzia\u0142a z WordPressem i dobrze wsp\u00f3\u0142pracuje z WordPressem (i kodem innych firm \u2013 nie zawsze, ale wiele razy).<\/p>\n<h2>Co dalej?<\/h2>\n<p>Nast\u0119pnie przyjrzymy si\u0119 interfejsom i abstrakcjom.<\/p>\n<p>S\u0105 one nadal podstaw\u0105 programowania obiektowego, ale je\u015bli zrozumia\u0142e\u015b poprzednie dwa posty, jeste\u015b przygotowany na solidne do\u015bwiadczenie z nadchodz\u0105cymi koncepcjami.<\/p>\n<p>A je\u015bli nie, nie martw si\u0119! Zawsze mo\u017cesz o tym porozmawia\u0107 w komentarzach lub mo\u017cemy porozmawia\u0107 o tym wi\u0119cej przez e-mail.<\/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>Tutaj podsumowuj\u0119 moje dwa posty na temat czterech filar\u00f3w OOP obejmuj\u0105cych dziedziczenie i polimorfizm wraz z funkcjonalnym demo.<\/p>\n","protected":false},"author":1,"featured_media":164983,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,845],"tags":[1169],"class_list":["post-229495","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-samouczki","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229495","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=229495"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229495\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/164983"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=229495"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=229495"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=229495"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}