{"id":230752,"date":"2022-12-07T10:17:00","date_gmt":"2022-12-07T07:17:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230752"},"modified":"2022-11-09T23:50:11","modified_gmt":"2022-11-09T20:50:11","slug":"un-moyen-simple-de-convertir-une-classe-standard-php-en-un-type-specifique","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/un-moyen-simple-de-convertir-une-classe-standard-php-en-un-type-specifique\/","title":{"rendered":"Un moyen simple de convertir une classe standard PHP en un type sp\u00e9cifique"},"content":{"rendered":"\n<p>Si vous travaillez avec PHP orient\u00e9 objet dans WordPress et que vous construisez divers mod\u00e8les adapt\u00e9s \u00e0 vos applications Web, il y a de fortes chances que vous ayez \u00e0 r\u00e9cup\u00e9rer des versions s\u00e9rialis\u00e9es de ces mod\u00e8les \u00e0 un moment donn\u00e9 de l&rsquo;ex\u00e9cution d&rsquo;un programme.<\/p>\n<p>Voici le probl\u00e8me, cependant\u00a0: parfois, ces donn\u00e9es non s\u00e9rialis\u00e9es reviennent sous forme de classes PHP standard. Cela signifie que si vous inspectez le type (via divers outils de d\u00e9bogage), vous verrez qu&rsquo;il s&rsquo;agit du type de <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>Si vous avez correctement construit vos mod\u00e8les, votre code va avoir des fonctions que la <strong>stdClass<\/strong> n&rsquo;a pas, et vous allez vouloir les appeler.<\/p>\n<p>De plus, vous ne pouvez pas simplement les convertir d&rsquo;un type \u00e0 un autre comme vous le feriez avec des types natifs (tels que des cha\u00eenes, des entiers, etc.). Dans de telles situations, vous devez pouvoir convertir une classe standard PHP en un type sp\u00e9cifique.<\/p>\n<p>Et voici une fonction qui vous aidera \u00e0 faire exactement cela.<\/p>\n<h2>Convertir un PHP en une classe standard en un type sp\u00e9cifique<\/h2>\n<p>Pour cet exemple, supposons ce qui suit\u00a0:<\/p>\n<ol>\n<li>J&rsquo;ai une classe dont l&rsquo;espace de noms est <strong>AcmeModelProduct<\/strong>.<\/li>\n<li>\u00c0 un moment donn\u00e9, il est enregistr\u00e9 dans la base de donn\u00e9es WordPress, mais une fois r\u00e9cup\u00e9r\u00e9, il est d\u00e9fini comme une instance de <strong>stdClass<\/strong>.<\/li>\n<li>J&rsquo;ai besoin que la version non s\u00e9rialis\u00e9e de l&rsquo;objet soit celle du <strong>Product<\/strong>.<\/li>\n<\/ol>\n<p>\u00c0 cette fin, j&rsquo;ai la fonction suivante disponible que je d\u00e9pose dans les projets <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\">selon mes besoins\u00a0:<\/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>Bien s\u00fbr, la fonction est comment\u00e9e avec autant de d\u00e9tails que possible, mais il y a certaines choses que je peux expliquer un peu plus dans le contexte d&rsquo;un article que dans le contexte d&rsquo;un commentaire de code.<\/p>\n<h3>Comprendre le code<\/h3>\n<p>Tout d&rsquo;abord, il est important de vous assurer que vous comprenez les fonctions PHP suivantes (qui sont toutes bien d\u00e9finies dans le manuel PHP)\u00a0:<\/p>\n<ul>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.unserialize.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">d\u00e9s\u00e9rialiser<\/a>. Cr\u00e9e une valeur PHP \u00e0 partir d&rsquo;une repr\u00e9sentation stock\u00e9e.<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.sprintf.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sprintf<\/a>. Renvoie une cha\u00eene format\u00e9e<\/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>. Obtenir la longueur de la cha\u00eene<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.strstr.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">strstr<\/a>. Trouver la premi\u00e8re occurrence d&rsquo;une cha\u00eene.<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.serialize.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">s\u00e9rialiser<\/a>. G\u00e9n\u00e8re une repr\u00e9sentation stockable d&rsquo;une valeur.<\/li>\n<\/ul>\n<p>Donc, oui, l&rsquo;instance entrante de la classe est r\u00e9cup\u00e9r\u00e9e puis convertie en type sp\u00e9cifi\u00e9, mais comment les fonctions ci-dessus jouent-elles un r\u00f4le \u00e0 cet \u00e9gard\u00a0? Cela a \u00e0 voir avec la fa\u00e7on dont une classe est s\u00e9rialis\u00e9e dans la base de donn\u00e9es WordPress.<\/p>\n<p>Prenons par exemple la <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/49aae6f2d029b369b2c4bdb35c7b8107#file-01-serialized-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cha\u00eene suivante\u00a0:<\/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>Je sais &#8211; ce n&rsquo;est pas vraiment un plaisir de passer en revue, mais c&rsquo;est exactement la fa\u00e7on dont WordPress s\u00e9rialise un objet. De plus, lorsqu&rsquo;il est extrait de la base de donn\u00e9es, il le fait puis est renvoy\u00e9 en tant <strong>qu&rsquo;instance stdClass<\/strong>, et non en tant qu&rsquo;instance du type qu&rsquo;il \u00e9tait avant d&rsquo;\u00eatre enregistr\u00e9.<\/p>\n<p>C&rsquo;est l\u00e0 que la fonction ci-dessus entre en jeu. Pour le restaurer dans son type de transaction, vous devrez le lancer comme tel. Et pour ce faire, vous pouvez simplement faire ce qui suit :<\/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>Notez que je r\u00e9cup\u00e8re un objet qui a \u00e9t\u00e9 s\u00e9rialis\u00e9 dans la table des options. Je ne pr\u00e9tends pas si vous devriez le faire ou non, c&rsquo;est \u00e0 titre d&rsquo;exemple.<\/p>\n<p>Deuxi\u00e8mement, notez que j&rsquo;appelle <strong>cast<\/strong> sur une instance de <strong>$this<\/strong> donc <strong>$this<\/strong> pourrait \u00eatre une instance d&rsquo;une classe ou une m\u00e9thode de la classe de base. Peu importe (tant que ce dernier est marqu\u00e9 comme <strong>protected<\/strong> ).<\/p>\n<p>\u00c0 partir de l\u00e0, vous avez maintenant une instance de la classe que vous avez enregistr\u00e9e \u00e0 l&rsquo;origine avec toutes les informations dont vous disposiez telles qu&rsquo;elles \u00e9taient lorsque vous l&rsquo;avez enregistr\u00e9e pour la premi\u00e8re fois.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vous ne pouvez pas simplement les convertir d&rsquo;un type \u00e0 un autre comme vous pouvez le faire avec les types natifs (tels que les cha\u00eenes, les entiers, etc.). Dans de telles situations, vous devez pouvoir convertir une classe standard PHP en un type sp\u00e9cifique.<\/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":[801],"tags":[1167],"class_list":["post-230752","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230752","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=230752"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230752\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/236170"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=230752"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=230752"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=230752"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}