✅ Новости WEB и WordPress, темы, плагины. Здесь мы делимся советами и лучшими решениями для веб-сайтов.

Простой способ привести стандартный класс PHP к определенному типу

26

Если вы работаете с объектно-ориентированным PHP в WordPress и создаете различные модели, подходящие для ваших веб-приложений, есть вероятность, что вам придется иметь дело с получением сериализованных версий этих моделей в какой-то момент выполнения программы.

Однако вот в чем дело: иногда эти несериализованные данные возвращаются в виде стандартных классов PHP. Это означает, что если вы проверите тип (с помощью различных инструментов отладки), вы увидите, что это тип stdClass.

Если вы правильно строили свои модели, ваш код будет иметь функции, которых нет в stdClass, и вы захотите их вызывать.

Кроме того, вы не можете просто преобразовать их из одного типа в другой, как в случае с нативными типами (такими как строки, целые числа и т. д.). В таких ситуациях вам нужно иметь возможность привести стандартный класс PHP к определенному типу.

И вот функция, которая поможет вам сделать именно это.

Приведение PHP стандартного класса к определенному типу

Для этого примера предположим следующее:

  1. У меня есть класс с пространством имен AcmeModelProduct.
  2. В какой-то момент он сохраняется в базе данных WordPress, но при извлечении устанавливается как экземпляр stdClass.
  3. Мне нужно, чтобы несериализованная версия объекта была версией Product.

Для этого у меня есть следующая функция, которую я добавляю в проекты по мере необходимости:

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

Конечно, функция прокомментирована настолько подробно, насколько я могу предоставить, но есть несколько вещей, которые я могу объяснить немного подробнее в контексте поста, чем в контексте комментария к коду.

Понимание кода

Во-первых, важно убедиться, что вы понимаете следующие функции PHP (все они четко определены в руководстве по PHP):

Итак, да, входящий экземпляр класса извлекается, а затем приводится к указанному типу, но как вышеупомянутые функции играют в этом роль? Это связано с тем, как класс сериализуется в базе данных WordPress.

Возьмем, к примеру, следующую строку:

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

Я знаю — это не совсем приятно просматривать, но именно так WordPress сериализует объект. Кроме того, когда он извлекается из базы данных, он делает это, а затем возвращается как экземпляр stdClass, а не как экземпляр того типа, которым он был до сохранения.

Вот где вышеупомянутая функция вступает в игру. Чтобы восстановить его до типа сделки, вы захотите разыграть его как таковой. И для этого вы можете просто сделать следующее:

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

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

Обратите внимание, что я получаю объект, который был сериализован в таблицу параметров. Я не утверждаю, стоит ли вам это делать или нет, это для примера.

Во- вторых, обратите внимание, что я вызываю приведение экземпляра $this, поэтому $this может быть экземпляром класса или методом базового класса. Это не имеет значения (пока последний помечен как protected ).

Теперь у вас есть экземпляр класса, который вы изначально сохранили, со всей доступной вам информацией, как если бы вы его впервые сохранили.

Источник записи: tommcfarlin.com

Этот веб-сайт использует файлы cookie для улучшения вашего опыта. Мы предполагаем, что вы согласны с этим, но вы можете отказаться, если хотите. Принимаю Подробнее