{"id":230901,"date":"2022-12-07T10:54:00","date_gmt":"2022-12-07T07:54:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230901"},"modified":"2022-11-10T00:30:57","modified_gmt":"2022-11-09T21:30:57","slug":"helppo-tapa-laehettaeae-php-standardiluokka-tiettyyn-tyyppiin","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/helppo-tapa-laehettaeae-php-standardiluokka-tiettyyn-tyyppiin\/","title":{"rendered":"Helppo tapa l\u00e4hett\u00e4\u00e4 PHP-standardiluokka tiettyyn tyyppiin"},"content":{"rendered":"\n<p>Jos ty\u00f6skentelet oliopohjaisen PHP:n kanssa WordPressiss\u00e4 ja rakennat erilaisia \u200b\u200bmalleja, jotka sopivat verkkosovelluksiisi, on todenn\u00e4k\u00f6ist\u00e4, ett\u00e4 joudut hakemaan sarjamuotoisia versioita n\u00e4ist\u00e4 malleista jossain vaiheessa ohjelman suorittamisen aikana.<\/p>\n<p>Asia on kuitenkin t\u00e4ss\u00e4: Joskus sarjoittamattomat tiedot tulevat takaisin tavallisiksi PHP-luokiksi. T\u00e4m\u00e4 tarkoittaa, ett\u00e4 jos tarkastat tyypin (erilaisten virheenkorjausty\u00f6kalujen avulla), n\u00e4et, ett\u00e4 ne ovat <a href=\"https:\/\/php.net\/manual\/en\/language.types.object.php#language.types.object.casting\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">stdClass<\/a> -tyyppi\u00e4 .<\/p>\n<p>Jos olet rakentanut mallejasi oikein, koodissasi on toimintoja, joita <strong>stdClassissa<\/strong> ei ole, ja haluat k\u00e4ytt\u00e4\u00e4 niit\u00e4.<\/p>\n<p>Lis\u00e4ksi et voi yksinkertaisesti suoratoistaa niit\u00e4 tyypist\u00e4 toiseen, kuten voit tehd\u00e4 natiivityypeill\u00e4 (kuten merkkijonot, kokonaisluvut ja niin edelleen). T\u00e4llaisissa tilanteissa sinun on voitava l\u00e4hett\u00e4\u00e4 PHP-standardiluokka tietylle tyypille.<\/p>\n<p>Ja t\u00e4ss\u00e4 on toiminto, joka auttaa sinua tekem\u00e4\u00e4n sen.<\/p>\n<h2>V\u00e4lit\u00e4 PHP vakioluokka tiettyyn tyyppiin<\/h2>\n<p>T\u00e4ss\u00e4 esimerkiss\u00e4 oletetaan seuraavaa:<\/p>\n<ol>\n<li>Minulla on luokka, jonka nimiv\u00e4li on <strong>AcmeModelProduct<\/strong>.<\/li>\n<li>Se tallennetaan jossain vaiheessa WordPress-tietokantaan, mutta noudettaessa se asetetaan <strong>stdClass<\/strong> -esiintym\u00e4ksi .<\/li>\n<li>Haluan, ett\u00e4 objektin serialoimaton versio on <strong>Tuotteen<\/strong> versio .<\/li>\n<\/ol>\n<p>T\u00e4t\u00e4 tarkoitusta varten minulla on k\u00e4ytett\u00e4viss\u00e4 seuraava toiminto, jonka voin osallistua projekteihin <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/49aae6f2d029b369b2c4bdb35c7b8107#file-00-cast-class-to-type-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tarpeen mukaan:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\/**\n * This function will take an instance of a PHP stdClass and attempt to cast it to\n * the type of the specified $className.\n *\n * For example, we may pass 'AcmeModelProduct' as the $className.\n *\n * @param object $instance  an instance of the stdClass to convert\n * @param string $className the name of the class type to which we want to cals\n *\n * @return mixed a version of the incoming $instance casted as the specified className\n *\/\nprotected function cast($instance, $className)\n{\n    return unserialize(sprintf(\n        'O:%d:\"%s\"%s',\n        strlen($className),\n        $className,\n        strstr(strstr(serialize($instance), '\"'), ':')\n    ));\n}\n<\/code><\/pre>\n<p>Toki toimintoa on kommentoitu niin yksityiskohtaisesti kuin voin tarjota, mutta on muutamia asioita, joita voin selitt\u00e4\u00e4 hieman tarkemmin viestin yhteydess\u00e4 kuin koodikommentin yhteydess\u00e4.<\/p>\n<h3>Koodin ymm\u00e4rt\u00e4minen<\/h3>\n<p>Ensinn\u00e4kin on t\u00e4rke\u00e4\u00e4 varmistaa, ett\u00e4 ymm\u00e4rr\u00e4t seuraavat PHP-toiminnot (jotka kaikki on m\u00e4\u00e4ritelty hyvin PHP-oppaassa):<\/p>\n<ul>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.unserialize.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">peruuttaa sarja<\/a>. Luo PHP-arvon tallennetusta esityksest\u00e4.<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.sprintf.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sprintf<\/a>. Palauta muotoiltu merkkijono<\/li>\n<li><strong><a href=\"https:\/\/php.net\/manual\/en\/function.sprintf.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">strlen<\/a><\/strong>. Hanki merkkijonon pituus<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.strstr.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">strstr<\/a>. Etsi merkkijonon ensimm\u00e4inen esiintym\u00e4.<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.serialize.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sarjoittaa<\/a>. Luo tallennettavan esityksen arvosta.<\/li>\n<\/ul>\n<p>Joten kyll\u00e4, luokan saapuva ilmentym\u00e4 haetaan ja sitten valetaan m\u00e4\u00e4ritetyksi tyypiksi, mutta miten yll\u00e4 olevat funktiot vaikuttavat t\u00e4h\u00e4n? Se liittyy siihen, kuinka luokka sarjoitetaan WordPress-tietokantaan.<\/p>\n<p>Otetaan esimerkiksi <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/49aae6f2d029b369b2c4bdb35c7b8107#file-01-serialized-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">seuraava merkkijono:<\/a><\/strong><\/p>\n<pre><code>O:17:\"AcmeModelProduct\":8:{s:25:\"\ufffdAcmeModelProduct\ufffdnumber\";s:3:\"532\";s:23:\"\ufffdAcmeModelProduct\ufffdname\";s:23:\"Aura Bath &amp; Spa - Matte\";s:27:\"\ufffdAcmeModelProduct\ufffdlongName\";s:56:\"Aura Bath &amp; Spa Waterborne Interior Paint - Matte Finish\";s:22:\"\ufffdAcmeModelProduct\ufffdurl\";s:37:\"http:\/\/www.benjaminmoore.com\/aura_532\";s:27:\"\ufffdAcmeModelProduct\ufffdshortUrl\";s:9:\"\/aura_532\";s:26:\"\ufffdAcmeModelProduct\ufffdimage1x\";s:153:\"www2.benjaminmoore.com\/ShowPropertyServlet?nodePath=\/BEA Repository\/imagerepository\/public_site\/product_images_new\/IA_pri_0532\/\/image_88x86.content_en_US\";s:26:\"\ufffdAcmeModelProduct\ufffdimage2x\";s:155:\"www2.benjaminmoore.com\/ShowPropertyServlet?nodePath=\/BEA Repository\/imagerepository\/public_site\/product_images_new\/IA_pri_0532\/\/image_197x193.content_en_US\";s:26:\"\ufffdAcmeModelProduct\ufffdimage3x\";s:155:\"www2.benjaminmoore.com\/ShowPropertyServlet?nodePath=\/BEA Repository\/imagerepository\/public_site\/product_images_new\/IA_pri_0532\/\/image_197x193.content_en_US\";}<\/code><\/pre>\n<p>Tied\u00e4n \u2013 sit\u00e4 ei ole aivan ilo arvostella, mutta se on t\u00e4sm\u00e4lleen miten WordPress sarjoi objektin. Lis\u00e4ksi, kun se haetaan tietokannasta, se tehd\u00e4\u00e4n niin ja palautetaan sitten <strong>stdClass-<\/strong> esiintym\u00e4n\u00e4, ei sen tyypin esiintym\u00e4n\u00e4, joka oli ennen sen tallentamista.<\/p>\n<p>Siell\u00e4 yll\u00e4 oleva toiminto tulee k\u00e4ytt\u00f6\u00f6n. Jos haluat palauttaa sen sopimustyyppiin, se kannattaa l\u00e4hett\u00e4\u00e4 sellaisenaan. Ja tehd\u00e4ksesi sen, voit yksinkertaisesti tehd\u00e4 seuraavan:<\/p>\n<pre><code>&lt;?php\n$exampleObject = get_option('acmeModelProject', null);\nif (null === $exampleObject) {\n  return;\n}\n\n$exampleObject = $this-&gt;cast($exampleObject, 'AcmeModelProduct');\n<\/code><\/pre>\n<p>Huomaa, ett\u00e4 haen objektia, joka on sarjoitettu asetustaulukkoon. En ota kantaa siihen, pit\u00e4isik\u00f6 sinun tehd\u00e4 t\u00e4m\u00e4 vai ei, t\u00e4m\u00e4 on esimerkiksi tarkoitus.<\/p>\n<p>Toiseksi, huomaa, ett\u00e4 kutsun <strong>castia<\/strong> <strong>$this<\/strong> -esiintym\u00e4\u00e4n, joten <strong>$this<\/strong> voi olla luokan esiintym\u00e4 tai se voi olla perusluokan metodi. Sill\u00e4 ei ole v\u00e4li\u00e4 (kunhan j\u00e4lkimm\u00e4inen on merkitty <strong>suojatuksi<\/strong> ).<\/p>\n<p>Sielt\u00e4 sinulla on nyt alun perin tallentamasi luokan esiintym\u00e4, jossa on kaikki k\u00e4ytett\u00e4viss\u00e4si olevat tiedot sellaisena kuin se oli tallentaessasi sen.<\/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>Et voi vain suoratoistaa niit\u00e4 tyypist\u00e4 toiseen, kuten voit tehd\u00e4 natiivityypeill\u00e4 (kuten merkkijonot, kokonaisluvut ja niin edelleen). T\u00e4llaisissa tilanteissa sinun on voitava l\u00e4hett\u00e4\u00e4 PHP-standardiluokka tietylle tyypille.<\/p>\n","protected":false},"author":1,"featured_media":236170,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[803],"tags":[1166],"class_list":["post-230901","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230901","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=230901"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230901\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/236170"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=230901"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=230901"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=230901"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}