Actualités WEB et WordPress, thèmes, plugins. Ici, nous partageons des conseils et les meilleures solutions de sites Web.

Un moyen simple de convertir une classe standard PHP en un type spécifique

28

Si vous travaillez avec PHP orienté objet dans WordPress et que vous construisez divers modèles adaptés à vos applications Web, il y a de fortes chances que vous ayez à récupérer des versions sérialisées de ces modèles à un moment donné de l’exécution d’un programme.

Voici le problème, cependant : parfois, ces données non sérialisées reviennent sous forme de classes PHP standard. Cela signifie que si vous inspectez le type (via divers outils de débogage), vous verrez qu’il s’agit du type de stdClass.

Si vous avez correctement construit vos modèles, votre code va avoir des fonctions que la stdClass n’a pas, et vous allez vouloir les appeler.

De plus, vous ne pouvez pas simplement les convertir d’un type à un autre comme vous le feriez avec des types natifs (tels que des chaînes, des entiers, etc.). Dans de telles situations, vous devez pouvoir convertir une classe standard PHP en un type spécifique.

Et voici une fonction qui vous aidera à faire exactement cela.

Convertir un PHP en une classe standard en un type spécifique

Pour cet exemple, supposons ce qui suit :

  1. J’ai une classe dont l’espace de noms est AcmeModelProduct.
  2. À un moment donné, il est enregistré dans la base de données WordPress, mais une fois récupéré, il est défini comme une instance de stdClass.
  3. J’ai besoin que la version non sérialisée de l’objet soit celle du Product.

À cette fin, j’ai la fonction suivante disponible que je dépose dans les projets selon mes besoins :

<?php
/**
 * This function will take an instance of a PHP stdClass and attempt to cast it to
 * the type of the specified $className.
 *
 * For example, we may pass 'AcmeModelProduct' as the $className.
 *
 * @param object $instance  an instance of the stdClass to convert
 * @param string $className the name of the class type to which we want to cals
 *
 * @return mixed a version of the incoming $instance casted as the specified className
 */
protected function cast($instance, $className)
{
    return unserialize(sprintf(
        'O:%d:"%s"%s',
        strlen($className),
        $className,
        strstr(strstr(serialize($instance), '"'), ':')
    ));
}

Bien sûr, la fonction est commentée avec autant de détails que possible, mais il y a certaines choses que je peux expliquer un peu plus dans le contexte d’un article que dans le contexte d’un commentaire de code.

Comprendre le code

Tout d’abord, il est important de vous assurer que vous comprenez les fonctions PHP suivantes (qui sont toutes bien définies dans le manuel PHP) :

  • désérialiser. Crée une valeur PHP à partir d’une représentation stockée.
  • sprintf. Renvoie une chaîne formatée
  • strlen. Obtenir la longueur de la chaîne
  • strstr. Trouver la première occurrence d’une chaîne.
  • sérialiser. Génère une représentation stockable d’une valeur.

Donc, oui, l’instance entrante de la classe est récupérée puis convertie en type spécifié, mais comment les fonctions ci-dessus jouent-elles un rôle à cet égard ? Cela a à voir avec la façon dont une classe est sérialisée dans la base de données WordPress.

Prenons par exemple la chaîne suivante :

O:17:"AcmeModelProduct":8:{s:25:"�AcmeModelProduct�number";s:3:"532";s:23:"�AcmeModelProduct�name";s:23:"Aura Bath & Spa - Matte";s:27:"�AcmeModelProduct�longName";s:56:"Aura Bath & Spa Waterborne Interior Paint - Matte Finish";s:22:"�AcmeModelProduct�url";s:37:"http://www.benjaminmoore.com/aura_532";s:27:"�AcmeModelProduct�shortUrl";s:9:"/aura_532";s:26:"�AcmeModelProduct�image1x";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:"�AcmeModelProduct�image2x";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:"�AcmeModelProduct�image3x";s:155:"www2.benjaminmoore.com/ShowPropertyServlet?nodePath=/BEA Repository/imagerepository/public_site/product_images_new/IA_pri_0532//image_197x193.content_en_US";}

Je sais – ce n’est pas vraiment un plaisir de passer en revue, mais c’est exactement la façon dont WordPress sérialise un objet. De plus, lorsqu’il est extrait de la base de données, il le fait puis est renvoyé en tant qu’instance stdClass, et non en tant qu’instance du type qu’il était avant d’être enregistré.

C’est là 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 :

<?php
$exampleObject = get_option('acmeModelProject', null);
if (null === $exampleObject) {
  return;
}

$exampleObject = $this->cast($exampleObject, 'AcmeModelProduct');

Notez que je récupère un objet qui a été sérialisé dans la table des options. Je ne prétends pas si vous devriez le faire ou non, c’est à titre d’exemple.

Deuxièmement, notez que j’appelle cast sur une instance de $this donc $this pourrait être une instance d’une classe ou une méthode de la classe de base. Peu importe (tant que ce dernier est marqué comme protected ).

À partir de là, vous avez maintenant une instance de la classe que vous avez enregistrée à l’origine avec toutes les informations dont vous disposiez telles qu’elles étaient lorsque vous l’avez enregistrée pour la première fois.

Source d’enregistrement: tommcfarlin.com

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More