{"id":230315,"date":"2022-12-07T10:11:00","date_gmt":"2022-12-07T07:11:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230315"},"modified":"2022-11-09T21:05:13","modified_gmt":"2022-11-09T18:05:13","slug":"ett-enkelt-saett-att-skapa-en-php-standardklass-till-en-specifik-typ","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/ett-enkelt-saett-att-skapa-en-php-standardklass-till-en-specifik-typ\/","title":{"rendered":"Ett enkelt s\u00e4tt att skapa en PHP-standardklass till en specifik typ"},"content":{"rendered":"\n<p>Om du arbetar med objektorienterad PHP i WordPress och du bygger ut olika modeller som passar dina webbapplikationer, \u00e4r oddsen att du kommer att ta itu med att h\u00e4mta serialiserade versioner av dessa modeller n\u00e5gon g\u00e5ng under ett programs k\u00f6rning.<\/p>\n<p>Men h\u00e4r \u00e4r grejen: Ibland kommer oserialiserade data tillbaka som vanliga PHP-klasser. Detta betyder att om du inspekterar typen (genom olika fels\u00f6kningsverktyg), kommer du att se att de \u00e4r av typen <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>.<\/p>\n<p>Om du har byggt dina modeller ordentligt kommer din kod att ha funktioner som <strong>stdClass<\/strong> inte har, och du kommer att vilja anv\u00e4nda dem.<\/p>\n<p>Dessutom kan du inte helt enkelt casta dem fr\u00e5n en typ till en annan som du kan med inbyggda typer (som str\u00e4ngar, heltal och s\u00e5 vidare). I s\u00e5dana situationer m\u00e5ste du kunna casta en PHP-standardklass till en specifik typ.<\/p>\n<p>Och h\u00e4r \u00e4r en funktion som hj\u00e4lper dig att g\u00f6ra just det.<\/p>\n<h2>Kasta en PHP en standardklass till en specifik typ<\/h2>\n<p>F\u00f6r det h\u00e4r exemplet, anta f\u00f6ljande:<\/p>\n<ol>\n<li>Jag har en klass som \u00e4r namnrymd som <strong>AcmeModelProduct<\/strong>.<\/li>\n<li>Den sparas vid n\u00e5got tillf\u00e4lle i WordPress-databasen men n\u00e4r den h\u00e4mtas st\u00e4lls den in som en instans av <strong>stdClass<\/strong>.<\/li>\n<li>Jag beh\u00f6ver den oserialiserade versionen av objektet som \u00e4r <strong>produktens<\/strong>.<\/li>\n<\/ol>\n<p>F\u00f6r det \u00e4ndam\u00e5let har jag f\u00f6ljande funktion tillg\u00e4nglig som jag sl\u00e4pper in i projekt <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\">n\u00e4r jag beh\u00f6ver den:<\/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>Visst, funktionen kommenteras med s\u00e5 mycket detaljer som jag kan ge, men det finns n\u00e5gra saker jag kan f\u00f6rklara lite l\u00e4ngre i ett inl\u00e4ggskontext \u00e4n vad jag kan i en kodkommentar.<\/p>\n<h3>F\u00f6rst\u00e5 koden<\/h3>\n<p>F\u00f6rst \u00e4r det viktigt att se till att du f\u00f6rst\u00e5r f\u00f6ljande PHP-funktioner (som alla \u00e4r v\u00e4ldefinierade i PHP-manualen):<\/p>\n<ul>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.unserialize.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">unserialisera<\/a>. Skapar ett PHP-v\u00e4rde fr\u00e5n en lagrad representation.<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.sprintf.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sprintf<\/a>. Returnera en formaterad str\u00e4ng<\/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>. F\u00e5 str\u00e4ngl\u00e4ngd<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.strstr.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">strstr<\/a>. Hitta den f\u00f6rsta f\u00f6rekomsten av en str\u00e4ng.<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.serialize.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">serialisera<\/a>. Genererar en lagringsbar representation av ett v\u00e4rde.<\/li>\n<\/ul>\n<p>S\u00e5, ja, den inkommande instansen av klassen h\u00e4mtas och castas sedan som den angivna typen men hur spelar ovanst\u00e5ende funktioner en roll i detta? Det har att g\u00f6ra med hur en klass serialiseras till WordPress-databasen.<\/p>\n<p>Ta till exempel <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/49aae6f2d029b369b2c4bdb35c7b8107#file-01-serialized-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">f\u00f6ljande str\u00e4ng:<\/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>Jag vet \u2013 det \u00e4r inte precis ett n\u00f6je att recensera, men det \u00e4r precis hur WordPress serialiserar ett objekt. Vidare, n\u00e4r det h\u00e4mtas fr\u00e5n databasen, g\u00f6rs det och returneras sedan som en <strong>stdClass-<\/strong> instans, inte som en instans av den typ som den var innan den sparades.<\/p>\n<p>Det \u00e4r d\u00e4r ovanst\u00e5ende funktion kommer in i bilden. F\u00f6r att \u00e5terst\u00e4lla den till sin dealtyp, vill du casta den som s\u00e5dan. Och f\u00f6r att g\u00f6ra det kan du helt enkelt g\u00f6ra f\u00f6ljande:<\/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>Observera att jag h\u00e4mtar ett objekt som har serialiserats till alternativtabellen. Jag argumenterar inte f\u00f6r om du ska g\u00f6ra detta eller inte, detta \u00e4r till exempel syften.<\/p>\n<p>F\u00f6r det andra, notera att jag anropar <strong>cast<\/strong> p\u00e5 en instans av <strong>$this<\/strong> s\u00e5 <strong>$this<\/strong> kan vara en instans av en klass eller det kan vara en metod i basklassen. Det spelar ingen roll (s\u00e5 l\u00e4nge det senare \u00e4r markerat som <strong>skyddat<\/strong> ).<\/p>\n<p>D\u00e4rifr\u00e5n har du nu en instans av klassen som du ursprungligen sparade med all information som var tillg\u00e4nglig f\u00f6r dig som det var n\u00e4r du f\u00f6rst sparade den.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Du kan inte bara casta dem fr\u00e5n en typ till en annan som du kan med inbyggda typer (som str\u00e4ngar, heltal och s\u00e5 vidare). I s\u00e5dana situationer m\u00e5ste du kunna casta en PHP-standardklass till en specifik typ.<\/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":[807],"tags":[1173],"class_list":["post-230315","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230315","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=230315"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230315\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/236170"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230315"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230315"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230315"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}