{"id":230224,"date":"2022-11-21T17:21:00","date_gmt":"2022-11-21T14:21:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230224"},"modified":"2022-11-21T17:25:56","modified_gmt":"2022-11-21T14:25:56","slug":"oop-n-kaksi-toista-pilaria","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/oop-n-kaksi-toista-pilaria\/","title":{"rendered":"OOP:n kaksi toista pilaria"},"content":{"rendered":"\n<p>Kuten mainitsin <strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/oop-n-kaksi-ensimmaeistae-pilaria\/\" title=\"t\u00e4m\u00e4n sarjan ensimm\u00e4isess\u00e4 viestiss\u00e4\">t\u00e4m\u00e4n sarjan ensimm\u00e4isess\u00e4 viestiss\u00e4<\/a><\/strong>, tulet usein kuulemaan olio-ohjelmoinnin kolmesta pilarista. Saatat my\u00f6s kuulla olio-ohjelmoinnin nelj\u00e4st\u00e4 pilarista.<\/p>\n<p>Eik\u00e4 kyse ole siit\u00e4, ett\u00e4 niit\u00e4 on yhteens\u00e4 seitsem\u00e4n tai mit\u00e4\u00e4n sellaista. Sen sijaan kyse on enemm\u00e4n siit\u00e4, mit\u00e4 ihmiset pit\u00e4v\u00e4t OOP:n perustana: Onko olemassa kolme vai nelj\u00e4 p\u00e4\u00e4konseptia?<\/p>\n<p>Voit p\u00e4\u00e4tell\u00e4 edellisest\u00e4 artikkelista (otsikosta puhumattakaan), uskon, ett\u00e4 niit\u00e4 on nelj\u00e4.<\/p>\n<p>Ja t\u00e4ss\u00e4 postauksessa aion kattaa kaksi viimeist\u00e4:<\/p>\n<ul>\n<li>perint\u00f6,<\/li>\n<li>ja polymorfismi<\/li>\n<\/ul>\n<p>Jos olet tehnyt mink\u00e4 tahansa olio-ohjelmoinnin ennen t\u00e4m\u00e4n artikkelin lukemista, olet todenn\u00e4k\u00f6isesti kuullut ainakin yhdest\u00e4 n\u00e4ist\u00e4.<\/p>\n<p>Siit\u00e4 huolimatta, katsotaanpa kutakin niist\u00e4 yksityiskohtaisemmin.<\/p>\n<h2>Kaksi muuta OOP:n pilaria<\/h2>\n<p>Ennen kuin ryhdyn n\u00e4ihin kaikkiin, haluan olla varma, ett\u00e4 olet perehtynyt siihen, mit\u00e4 olemme k\u00e4sitelleet t\u00e4h\u00e4n menness\u00e4.<\/p>\n<h3>Sana analyysist\u00e4<\/h3>\n<p>En k\u00e4sittele asiaa, mutta koko syy, miksi puhun nyt oliokeskeisist\u00e4 perusteista, on se, ett\u00e4 olemme siirtym\u00e4ss\u00e4 t\u00e4m\u00e4n materiaalin eri vaiheeseen. Aloimme k\u00e4sitell\u00e4 <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-analysis\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">analyysivaihetta<\/a><\/strong>, joka sis\u00e4lsi:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/olio-ohjelmointi-wordpressissae-analyysi-osa-1\/\" title=\"Analyysi, osa 1\">Analyysi, osa 1<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/olio-ohjelmointi-wordpressissae-analyysi-osa-2\/\" title=\"Analyysi, osa 2\">Analyysi, osa 2<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/olio-ohjelmointi-wordpressissae-asiakkaiden-odotusten-ymmaertaeminen\/\" title=\"Asiakkaiden odotusten ymm\u00e4rt\u00e4minen\">Asiakkaiden odotusten ymm\u00e4rt\u00e4minen<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/olio-ohjelmointi-wordpressissae-tyoeselostus\/\" title=\"Ty\u00f6selostus\">Ty\u00f6selostus<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/olio-ohjelmointi-wordpressissae-ehdot-ja-ehdot\/\" title=\"K\u00e4ytt\u00f6ehdot\">K\u00e4ytt\u00f6ehdot<\/a><\/li>\n<\/ol>\n<h3>Nyt Kehitykseen<\/h3>\n<p>Ja nyt ollaan <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kehitysvaiheessa<\/a><\/strong>. Jotkut saattavat kutsua sit\u00e4 perusteiksi (mutta olen tyytyv\u00e4inen, ett\u00e4 et voi tehd\u00e4 hyv\u00e4\u00e4 kehityst\u00e4 ilman perusasioita, joten siin\u00e4 on (.<\/p>\n<p>Jos et ole lukenut <strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/oop-n-kaksi-ensimmaeistae-pilaria\/\" title=\"edellist\u00e4 viesti\u00e4\">edellist\u00e4 viesti\u00e4<\/a><\/strong>, suosittelen tekem\u00e4\u00e4n niin ennen kuin jatkat, sill\u00e4 se kattaa k\u00e4sitteet abstraktio, kapselointi ja miten se liittyy WordPressiin.<\/p>\n<h3>3 Perint\u00f6<\/h3>\n<p>Perinn\u00f6n k\u00e4site on melko helppo seurata. Eli yksi luokka voi peri\u00e4 toisen luokan attribuutteja. Annan muutaman esimerkin t\u00e4st\u00e4 hetkess\u00e4, mutta anna minun antaa toimiva m\u00e4\u00e4ritelm\u00e4 t\u00e4m\u00e4n viestin tarkoituksiin:<\/p>\n<blockquote>\n<p>Periytys viittaa ajatukseen, ett\u00e4 yksi luokka, vaikka sill\u00e4 on oma toteutus, kirjaimellisesti perii ominaisuudet, funktiot ja yleisen toteutuksen emoluokalta.<\/p>\n<\/blockquote>\n<h4>Esimerkki 1: Asiakirja<\/h4>\n<p>Hyvin yksinkertaisesti sanottuna, oletetaan, ett\u00e4 sinulla on luokka nimelt\u00e4 Asiakirja ja asiakirjalla on otsikko ja sill\u00e4 on sis\u00e4lt\u00f6. Sitten on asiakirjan alaluokka, jolla on p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4n ja ajan m\u00e4\u00e4ritteet. Voisimme kutsua t\u00e4t\u00e4 PostDocumentiksi tai PageDocumentiksi.<\/p>\n<p>Toisin sanoen PageDocument <strong>perii<\/strong> Documentin ominaisuudet ja attribuutit samalla kun lis\u00e4\u00e4 siihen oman toteutuksensa. K\u00e4yd\u00e4 j\u00e4rkeen?<\/p>\n<p>Jos ei, \u00e4l\u00e4 huoli. Se ei aina &quot;klikkaa&quot; aluksi, joten katsotaanpa toista esimerkki\u00e4.<\/p>\n<h4>Esimerkki 2: Viesti<\/h4>\n<p>Oletetaan, ett\u00e4 meill\u00e4 on Viesti-luokka. Viestill\u00e4 on tyypillisesti kaksi ominaisuutta:<\/p>\n<ul>\n<li>1 L\u00e4hett\u00e4j\u00e4,<\/li>\n<li>2 Vastaanottaja.<\/li>\n<\/ul>\n<p>On kuitenkin reilua sanoa, ett\u00e4 viestej\u00e4 on erilaisia, eik\u00f6? Eli ehk\u00e4 meill\u00e4 on s\u00e4hk\u00f6postiviesti tai kenties tekstiviesti.<\/p>\n<p>S\u00e4hk\u00f6postiviestill\u00e4 on edelleen l\u00e4hett\u00e4j\u00e4 ja edelleen vastaanottaja, mutta sill\u00e4 on paljon muuta, eik\u00f6? Siin\u00e4 on asioita, kuten:<\/p>\n<ul>\n<li>aiherivi,<\/li>\n<li>valinnainen liite,<\/li>\n<li>toinen joukko l\u00e4hett\u00e4ji\u00e4, joille se on l\u00e4hetetty,<\/li>\n<li>tuki muiden kopioimiseen viestiin julkisesti tai yksityisesti,<\/li>\n<li>ja paljon enemm\u00e4n.<\/li>\n<\/ul>\n<p>Toisaalta tekstiviestiss\u00e4 ei v\u00e4ltt\u00e4m\u00e4tt\u00e4 ole kaikkia yll\u00e4 olevia. Oletetaan, ett\u00e4 puhumme perustekstiviestist\u00e4 (verrattuna monimuotoiseen tekstiviestiin, kuten Hangoutsissa, Telegramissa, iMessagessa tai miss\u00e4 tahansa muussa).<\/p>\n<p>T\u00e4m\u00e4 luokka:<\/p>\n<ul>\n<li>olla sidottu puhelinnumeroon,<\/li>\n<li>voi sis\u00e4lt\u00e4\u00e4 ryhm\u00e4n muita vastaanottajia, jotka kaikki ovat julkisia,<\/li>\n<li>operaattori (eli matkapuhelinoperaattori),<\/li>\n<li>enimm\u00e4ism\u00e4\u00e4r\u00e4 merkkej\u00e4, jonka se voi sis\u00e4lt\u00e4\u00e4<\/li>\n<li>mahdollisuus jakaa yksi viesti useiksi viesteiksi, jos merkkien enimm\u00e4ism\u00e4\u00e4r\u00e4 ylitt\u00e4\u00e4 tietyn merkkim\u00e4\u00e4r\u00e4n.<\/li>\n<\/ul>\n<p>Mutta se her\u00e4tt\u00e4\u00e4 silti kysymyksi\u00e4 ominaisuuksista ja menetelmist\u00e4 (tai yleisemmin toteutuksesta, eik\u00f6?)<\/p>\n<h4>Sana toteutuksesta<\/h4>\n<p>Mit\u00e4 tulee olio-ohjelmointiin, meill\u00e4 on niin kutsutut k\u00e4ytt\u00f6oikeusmuuntimet. Ehk\u00e4 olet lukenut niit\u00e4 muualla, esimerkiksi n\u00e4kyvyyden muokkaajiksi tai vastaavaksi.<\/p>\n<p>Ihan sama.<\/p>\n<p>Lyhyesti sanottuna n\u00e4m\u00e4 muuntajat voidaan m\u00e4\u00e4ritell\u00e4 seuraavasti:<\/p>\n<blockquote>\n<p>Avainsanat, jotka m\u00e4\u00e4r\u00e4\u00e4v\u00e4t, mit\u00e4 muilla luokilla on p\u00e4\u00e4sy k\u00e4sill\u00e4 olevaan tietoon.<\/p>\n<\/blockquote>\n<p>Lucikly, t\u00e4m\u00e4 osa on helppo ymm\u00e4rt\u00e4\u00e4:<\/p>\n<ul>\n<li><strong>yksityiset<\/strong> ominaisuudet ja funktiot ovat vain sen luokan k\u00e4ytett\u00e4viss\u00e4, jossa ne on m\u00e4\u00e4ritelty. T\u00e4m\u00e4 tarkoittaa, ett\u00e4 PostDocument ei voi k\u00e4ytt\u00e4\u00e4 mit\u00e4\u00e4n yksityiseksi merkityss\u00e4 asiakirjassa. PostDocument ei ole edes tietoinen n\u00e4iden tietojen olemassaolosta.<\/li>\n<li><strong>suojatut<\/strong> ominaisuudet ja toiminnot ovat saatavilla luokalle, jossa ne on m\u00e4\u00e4ritelty, ja kaikille luokille, jotka ovat j\u00e4lkel\u00e4isi\u00e4. Toisin sanoen kaikilla luokilla, jotka periv\u00e4t tiedot perusluokalta tai emaluokalta, on p\u00e4\u00e4sy siihen. Joten toisin kuin <strong>yksityiset<\/strong> toteutustiedot, PostDocument voi k\u00e4ytt\u00e4\u00e4 tietoja asiakirjasta, jos se on merkitty suojatuksi.<\/li>\n<li><strong>julkiset<\/strong> kiinteist\u00f6t ja toiminnot ovat kaikkien saatavilla. T\u00e4ll\u00e4 ei todellakaan ole mit\u00e4\u00e4n tekemist\u00e4 perinn\u00f6n kanssa, vaan enemm\u00e4n kapseloinnin kanssa, jos mit\u00e4\u00e4n. Sen sijaan kyse on p\u00e4\u00e4tt\u00e4misest\u00e4, mit\u00e4 haluamme muiden objektien p\u00e4\u00e4sev\u00e4n k\u00e4siksi.<\/li>\n<\/ul>\n<p>Miten toteutus sitten hoidetaan? T\u00e4m\u00e4 vaihtelee kielest\u00e4 toiseen, mutta PHP ei tue niin sanottua &quot;moniperint\u00f6\u00e4&quot;. Yksinkertaisesti sanottuna tietty <a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP:n luokka voi peri\u00e4 (tai laajentaa) vain yhden muun luokan<\/a>. Ei useita luokkia (jotkut kielet tukevat t\u00e4t\u00e4).<\/p>\n<blockquote>\n<p>Kun laajennat luokkaa, alaluokka perii kaikki julkiset ja suojatut menetelm\u00e4t p\u00e4\u00e4luokasta. Ellei luokka ohita n\u00e4it\u00e4 menetelmi\u00e4, ne s\u00e4ilytt\u00e4v\u00e4t alkuper\u00e4isen toiminnallisuutensa.<\/p>\n<\/blockquote>\n<p>Esimerkiss\u00e4mme emme voi ottaa k\u00e4ytt\u00f6\u00f6n toista luokkaa, kuten WrittenDocument, joka perii PageDocumentista sek\u00e4 PostDocumentista. Se on joko yksi tai toinen. Ja on syyt\u00e4 huomata, ett\u00e4 jos se perii PostDocumentista, se perii my\u00f6s tiedot asiakirjasta, koska se on luokan alaluokan alaluokka.<\/p>\n<h3>4 Polymorfismi<\/h3>\n<p>Nyt kun meill\u00e4 on perinn\u00f6n perusm\u00e4\u00e4ritelm\u00e4, voimme puhua polymorfismista. Hyv\u00e4 uutinen on, ett\u00e4 se on suuri, outo sana hyvin yksinkertaiselle k\u00e4sitteelle.<\/p>\n<p>Huono uutinen on, ett\u00e4 emme ole puhuneet k\u00e4ytt\u00f6liittymist\u00e4 tai abstrakteista luokista. N\u00e4it\u00e4 on tulossa, mutta niit\u00e4 pidet\u00e4\u00e4n osana nelj\u00e4\u00e4 pilaria, joten \u00e4l\u00e4 huolehdi niist\u00e4 juuri nyt.<\/p>\n<p>Ajattele sen sijaan n\u00e4in:<\/p>\n<blockquote>\n<p>Polymorfismin avulla voimme viitata yhden tyypin luokkaan, kun se voidaan julistaa toiseksi tyypiksi.<\/p>\n<\/blockquote>\n<p>Se voi silti olla h\u00e4mment\u00e4v\u00e4\u00e4, mutta muistatko esimerkiksi yll\u00e4 olevan Viestiesimerkkimme? Voimme luoda SMSMessage-luokan, joka <strong>laajentaa<\/strong> Viesti-luokkaa ja kutsua sitten tiettyj\u00e4 menetelmi\u00e4 siin\u00e4.<\/p>\n<p>SMSMessagella voi olla menetelm\u00e4, joka on Viesti-luokassa. Ja jos luokka on instantoitu SMSMessage-luokan esiintym\u00e4n\u00e4, se kutsuu t\u00e4t\u00e4 menetelm\u00e4\u00e4. Vastaavasti, jos sill\u00e4 ei ole menetelm\u00e4\u00e4, mutta sen p\u00e4\u00e4luokassa Message on se, se kutsuu sit\u00e4 menetelm\u00e4\u00e4.<\/p>\n<p>Joskus on helpointa ymm\u00e4rt\u00e4\u00e4 t\u00e4m\u00e4 koodissa, joten tehd\u00e4\u00e4n niin.<\/p>\n<p>Ensin m\u00e4\u00e4ritell\u00e4\u00e4n <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-00-message-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">viestiluokkamme<\/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>Sitten m\u00e4\u00e4ritell\u00e4\u00e4n <a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-01-smsmessage-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">SMSMessage<\/a> -luokkamme. Huomaa, ett\u00e4 siin\u00e4 ei ole <strong>Receive()-<\/strong> funktiota. T\u00e4m\u00e4 on hetkellisesti t\u00e4rke\u00e4\u00e4:<\/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><strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-02-functionaldemo1-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Instantoidaan nyt Viesti<\/a><\/strong> &#8211; luokkamme ja kutsutaan muutama menetelm\u00e4:<\/p>\n<pre><code>&lt;?php\n$message = new Message();\n$message-&gt;send();\n$message-&gt;receive();<\/code><\/pre>\n<p>Ja tehd\u00e4\u00e4n sama <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-03-functionaldemo2-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">k\u00e4ytt\u00e4m\u00e4ll\u00e4 SMSMessage-luokkaa:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n$message = new SMSMessage();\n$message-&gt;send();\n$message-&gt;receive();<\/code><\/pre>\n<p>Jos haluat koko skriptin, voit n\u00e4hd\u00e4 sen <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-04-workingdemo-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4\u00e4lt\u00e4<\/a><\/strong>, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-04-workingdemo-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ladata<\/a> sen ja suorittaa sen paikallisesti.<\/p>\n<h2>Perinn\u00f6llisyys, polymorfismi ja WordPress<\/h2>\n<p>T\u00e4ss\u00e4 on otos (ja tutkimme t\u00e4t\u00e4 enemm\u00e4n, kun tutustumme k\u00e4ytt\u00f6liittymiin ja abstrakteihin luokkiin): Kun luokka <strong>laajentaa<\/strong> toista luokkaa eik\u00e4 sill\u00e4 ole sen yl\u00e4luokan toteutustietoja, k\u00e4ytet\u00e4\u00e4n yl\u00e4tason toteutusta.<\/p>\n<p>Toinen tapa ajatella sit\u00e4 on &quot;ty\u00f6st\u00e4\u00e4 komentoketjua&quot;. Se alkaa luokasta, joka on alhaisin luomamme. Yll\u00e4 olevassa esimerkiss\u00e4mme se on SMSMessage. Jos se ei l\u00f6yd\u00e4 sit\u00e4 sielt\u00e4, se siirtyy luokkaan, johon se ulottuu. (Ja jos se ei l\u00f6yd\u00e4 sit\u00e4 sielt\u00e4 ja luokka laajentaa luokkaa, se yritt\u00e4\u00e4 siell\u00e4.)<\/p>\n<p>Koko polymorfinen asia on t\u00e4m\u00e4: Olemme instantoineet yhden tyypin luokan, SMSMessage, mutta se k\u00e4ytt\u00e4\u00e4 toisen tyypin luokan toteutusta (jota se perii, kyll\u00e4, mutta se on kuitenkin erilainen).<\/p>\n<h3>Kurssien kirjoittaminen WordPressiss\u00e4<\/h3>\n<p>Lopuksi haluan j\u00e4tt\u00e4\u00e4 sinulle t\u00e4m\u00e4n: Olen maininnut jotain vastaavaa edellisess\u00e4 viestiss\u00e4, mutta haluan toistaa sen t\u00e4ss\u00e4.<\/p>\n<p>Riippumatta siit\u00e4, kuinka monta n\u00e4ist\u00e4 k\u00e4sitteist\u00e4 WordPress-ydin k\u00e4ytt\u00e4\u00e4, sill\u00e4 ei ole v\u00e4li\u00e4, koska voimme kirjoittaa WordPressiin korkealaatuista, oliopohjaista koodia, joka on vuorovaikutuksessa WordPressin kanssa ja joka toimii hienosti WordPressin (ja muun kolmannen osapuolen koodin \u2013 ei aina) kanssa., mutta monta kertaa).<\/p>\n<h2>Mit\u00e4 seuraavaksi?<\/h2>\n<p>Seuraavaksi tarkastelemme k\u00e4ytt\u00f6liittymi\u00e4 ja abstraktioita.<\/p>\n<p>N\u00e4m\u00e4 ovat edelleen olennaisia \u200b\u200bolio-ohjelmoinnin kannalta, mutta jos olet ymm\u00e4rt\u00e4nyt kaksi edellist\u00e4 viesti\u00e4, olet valmis saamaan vankan kokemuksen tulevista k\u00e4sitteist\u00e4.<\/p>\n<p>Ja jos ei, \u00e4l\u00e4 huoli! Voit aina keskustella siit\u00e4 kommenteissa tai voimme keskustella aiheesta lis\u00e4\u00e4 s\u00e4hk\u00f6postitse.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>P\u00e4\u00e4t\u00e4n t\u00e4h\u00e4n kaksi viesti\u00e4ni OOP:n nelj\u00e4st\u00e4 pilarista, jotka kattavat perinn\u00f6n ja polymorfismin sek\u00e4 toimivan esittelyn.<\/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":[719,895,843],"tags":[1166],"class_list":["post-230224","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-opetusohjelmia","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230224","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=230224"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230224\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/164983"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=230224"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=230224"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=230224"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}