✅ Noticias, temas, complementos de WEB y WordPress. Aquí compartimos consejos y las mejores soluciones para sitios web.

Una manera fácil de convertir una clase estándar de PHP en un tipo específico

25

Si trabaja con PHP orientado a objetos en WordPress y está creando varios modelos que se adaptan a sus aplicaciones web, lo más probable es que se enfrente a la recuperación de versiones serializadas de esos modelos en algún momento durante la ejecución de un programa.

Sin embargo, aquí está la cosa: a veces, los datos no serializados regresan como clases estándar de PHP. Esto significa que si inspecciona el tipo (a través de varias herramientas de depuración), verá que son del tipo de stdClass.

Si ha estado construyendo correctamente sus modelos, su código tendrá funciones que stdClass no tiene, y querrá llamarlas.

Además, no puede simplemente convertirlos de un tipo a otro como puede hacerlo con los tipos nativos (como cadenas, enteros, etc.). En situaciones como esa, debe poder convertir una clase estándar de PHP en un tipo específico.

Y aquí hay una función que te ayudará a hacer precisamente eso.

Transmitir una clase estándar de PHP a un tipo específico

Para este ejemplo, suponga lo siguiente:

  1. Tengo una clase que tiene un espacio de nombres como AcmeModelProduct.
  2. En algún momento, se guarda en la base de datos de WordPress, pero cuando se recupera se establece como una instancia de stdClass.
  3. Necesito que la versión no serializada del objeto sea la del Producto.

Con ese fin, tengo disponible la siguiente función que coloco en los proyectos cuando la necesito:

<?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), '"'), ':')
    ));
}

Claro, la función se comenta con tanto detalle como puedo proporcionar, pero hay algunas cosas que puedo explicar un poco más en el contexto de una publicación que en el contexto de un comentario de código.

Comprender el código

Primero, es importante asegurarse de comprender las siguientes funciones de PHP (todas bien definidas en el manual de PHP):

  • deserializar _ Crea un valor PHP a partir de una representación almacenada.
  • sprintf. Devolver una cadena formateada
  • strlen _ Obtener longitud de cadena
  • callestr. Encuentra la primera aparición de una cadena.
  • serializar _ Genera una representación almacenable de un valor.

Entonces, sí, la instancia entrante de la clase se recupera y luego se convierte en el tipo especificado, pero ¿cómo juegan un papel las funciones anteriores en esto? Tiene que ver con cómo se serializa una clase en la base de datos de WordPress.

Tomemos por ejemplo la siguiente cadena:

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";}

Lo sé, no es exactamente un placer revisarlo, pero es exactamente cómo WordPress serializa un objeto. Además, cuando se recupera de la base de datos, se hace y luego se devuelve como una instancia de stdClass, no como una instancia del tipo que era antes de que se guardara.

Ahí es donde entra en juego la función anterior. Para restaurarlo a su tipo de trato, querrá emitirlo como tal. Y para hacer eso, simplemente puede hacer lo siguiente:

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

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

Tenga en cuenta que estoy recuperando un objeto que se ha serializado en la tabla de opciones. No estoy argumentando si debe hacer esto o no, esto es para fines de ejemplo.

En segundo lugar, tenga en cuenta que estoy llamando a emitir en una instancia de $this, por lo que $this podría ser una instancia de una clase o podría ser un método en la clase base. No importa (siempre y cuando este último esté marcado como protected ).

A partir de ahí, ahora tiene una instancia de la clase que guardó originalmente con toda la información disponible como cuando la guardó por primera vez.

Fuente de grabación: 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