{"id":230316,"date":"2022-12-07T10:29:00","date_gmt":"2022-12-07T07:29:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230316"},"modified":"2022-11-09T21:05:34","modified_gmt":"2022-11-09T18:05:34","slug":"lihtne-viis-php-standardklassi-konkreetsesse-tueuepi-uelekandmiseks","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/lihtne-viis-php-standardklassi-konkreetsesse-tueuepi-uelekandmiseks\/","title":{"rendered":"Lihtne viis PHP standardklassi konkreetsesse t\u00fc\u00fcpi \u00fclekandmiseks"},"content":{"rendered":"\n<p>Kui t\u00f6\u00f6tate WordPressis objektorienteeritud PHP-ga ja loote erinevaid mudeleid, mis sobivad teie veebirakendustega, on t\u00f5en\u00e4oline, et hakkate mingil hetkel programmi t\u00e4itmise ajal tegelema nende mudelite jadaversioonide hankimisega.<\/p>\n<p>Siin on aga asi: m\u00f5nikord tulevad seeriata andmed tagasi tavaliste PHP klassidena. See t\u00e4hendab, et kui uurite t\u00fc\u00fcpi (erinevate silumist\u00f6\u00f6riistade kaudu), n\u00e4ete, et tegemist on <a href=\"https:\/\/php.net\/manual\/en\/language.types.object.php#language.types.object.casting\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">stdClassi t\u00fc\u00fcbiga<\/a>.<\/p>\n<p>Kui olete oma mudeleid \u00f5igesti \u00fcles ehitanud, on teie koodil funktsioone, mida <strong>stdClassil<\/strong> pole, ja soovite neid kasutada.<\/p>\n<p>Lisaks ei saa te neid lihtsalt \u00fchest t\u00fc\u00fcbist teise \u00fcle kanda, nagu saate teha omat\u00fc\u00fcpidega (nt stringid, t\u00e4isarvud jne). Sellistes olukordades peate suutma PHP standardklassi konkreetsele t\u00fc\u00fcbile \u00fcle kanda.<\/p>\n<p>Ja siin on funktsioon, mis aitab teil seda teha.<\/p>\n<h2>Kandke PHP standardklassist kindlasse t\u00fc\u00fcpi<\/h2>\n<p>Selle n\u00e4ite puhul eeldage j\u00e4rgmist.<\/p>\n<ol>\n<li>Mul on klass, mille nimeruum on <strong>AcmeModelProduct<\/strong>.<\/li>\n<li>Mingil hetkel salvestatakse see WordPressi andmebaasi, kuid laadimisel m\u00e4\u00e4ratakse see <strong>stdClassi eksemplariks<\/strong>.<\/li>\n<li>Mul on vaja, et objekti mitteseeriaversioon oleks toote <strong>versioon<\/strong>.<\/li>\n<\/ol>\n<p>Selleks on mul saadaval j\u00e4rgmine funktsioon, mida ma <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\">vajadusel projektidesse l\u00fclitan:<\/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>Muidugi on funktsiooni kommenteeritud nii \u00fcksikasjalikult, kui ma suudan, kuid on m\u00f5nda asja, mida saan postituse kontekstis selgitada veidi rohkem kui koodikommentaari kontekstis.<\/p>\n<h3>Koodeksi m\u00f5istmine<\/h3>\n<p>Esiteks on oluline veenduda, et m\u00f5istate j\u00e4rgmisi PHP funktsioone (k\u00f5ik need on PHP k\u00e4siraamatus t\u00e4pselt m\u00e4\u00e4ratletud):<\/p>\n<ul>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.unserialize.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00fchistada seeria<\/a>. Loob PHP v\u00e4\u00e4rtuse salvestatud esitusest.<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.sprintf.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sprintf<\/a>. Tagastab vormindatud stringi<\/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>. Hangi stringi pikkus<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.strstr.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">strstr<\/a>. Leidke stringi esimene esinemine.<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.serialize.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">serialiseerima<\/a>. Loob v\u00e4\u00e4rtuse salvestatava esituse.<\/li>\n<\/ul>\n<p>Niisiis, jah, klassi sissetulev eksemplar tuuakse v\u00e4lja ja seej\u00e4rel kantakse kindlaks m\u00e4\u00e4ratud t\u00fc\u00fcbina, kuid kuidas \u00fclaltoodud funktsioonid selles rolli m\u00e4ngivad? See on seotud sellega, kuidas klass WordPressi andmebaasi j\u00e4rjestatakse.<\/p>\n<p>V\u00f5tke n\u00e4iteks <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/49aae6f2d029b369b2c4bdb35c7b8107#file-01-serialized-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">j\u00e4rgmine string:<\/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>Ma tean \u2013 seda pole just r\u00f5\u00f5m vaadata, aga t\u00e4pselt nii teeb WordPress objekti serialiseerimise. Veelgi enam, kui see tuuakse andmebaasist v\u00e4lja, tehakse seda ja tagastatakse seej\u00e4rel <strong>stdClassi<\/strong> eksemplarina, mitte selle t\u00fc\u00fcbi eksemplarina, mis oli enne salvestamist.<\/p>\n<p>Siin tulebki m\u00e4ngu \u00fclaltoodud funktsioon. Selle tehingut\u00fc\u00fcbi taastamiseks soovite selle sellisena \u00fcle kanda. Ja selleks saate lihtsalt teha j\u00e4rgmist.<\/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>Pange t\u00e4hele, et ma toon objekti, mis on suvandite tabelisse serialiseeritud. Ma ei taha v\u00e4ita, kas peaksite seda tegema v\u00f5i mitte, see on n\u00e4iteks eesm\u00e4rkidel.<\/p>\n<p>Teiseks pange t\u00e4hele, et ma kutsun <strong>cast&#8217;i<\/strong> <strong>$this<\/strong> eksemplarile, nii et <strong>$this<\/strong> v\u00f5ib olla klassi eksemplar v\u00f5i see v\u00f5ib olla baasklassi meetod. See ei oma t\u00e4htsust (kui viimane on m\u00e4rgitud <strong>kaitstuks<\/strong> ).<\/p>\n<p>Sealt edasi on teil n\u00fc\u00fcd algselt salvestatud klassi eksemplar koos kogu teile k\u00e4ttesaadava teabega, nagu see oli selle esmakordsel salvestamisel.<\/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>Te ei saa neid lihtsalt \u00fchest t\u00fc\u00fcbist teise \u00fcle kanda, nagu saate teha omat\u00fc\u00fcpidega (nt stringid, t\u00e4isarvud jne). Sellistes olukordades peate suutma PHP standardklassi konkreetsele t\u00fc\u00fcbile \u00fcle kanda.<\/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":[802],"tags":[1165],"class_list":["post-230316","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-4","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/230316","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/comments?post=230316"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/230316\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/236170"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=230316"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=230316"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=230316"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}