✅ WEB і WordPress новини, теми, плагіни. Тут ми ділимося порадами і кращими рішеннями для сайтів.

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

15

Якщо ви працюєте з об’єктно-орієнтованим 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):

  • десеріалізувати. Створює значення PHP із збереженого представлення.
  • sprintf. Повертає відформатований рядок
  • strlen. Отримати довжину рядка
  • strstr. Знайдіть перше входження рядка.
  • серіалізувати. Створює представлення значення, яке можна зберегти.

Отже, так, вхідний екземпляр класу отримується, а потім перетворюється на вказаний тип, але яку роль у цьому відіграють наведені вище функції? Це пов’язано з тим, як клас серіалізується в базу даних 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');

Зауважте, що я отримую об’єкт, який було серіалізовано до таблиці параметрів. Я не доводжу, чи варто вам це робити чи ні, це для прикладу.

По- друге, зауважте, що я викликаю cast для екземпляра $this, тому $this може бути екземпляром класу або це може бути метод у базовому класі. Це не має значення (якщо останній позначено як захищений ).

З цього моменту у вас є екземпляр класу, який ви спочатку зберегли, з усією доступною для вас інформацією, так би мовити, коли ви його вперше зберегли.

Джерело запису: tommcfarlin.com

Цей веб -сайт використовує файли cookie, щоб покращити ваш досвід. Ми припустимо, що з цим все гаразд, але ви можете відмовитися, якщо захочете. Прийняти Читати далі