✅ Nowości, motywy, wtyczki WEB i WordPress. Tutaj dzielimy się wskazówkami i najlepszymi rozwiązaniami dla stron internetowych.

Prosty sposób na rzutowanie standardowej klasy PHP na określony typ

27

Jeśli pracujesz z obiektowym PHP w WordPressie i budujesz różne modele, które pasują do twoich aplikacji internetowych, istnieje prawdopodobieństwo, że będziesz miał do czynienia z pobieraniem zserializowanych wersji tych modeli w pewnym momencie podczas wykonywania programu.

Oto jednak rzecz: Czasami te niezserializowane dane wracają jako standardowe klasy PHP. Oznacza to, że jeśli sprawdzisz typ (za pomocą różnych narzędzi do debugowania), zobaczysz, że jest to typ stdClass.

Jeśli poprawnie zbudowałeś te modele, twój kod będzie zawierał funkcje, których nie ma klasa stdClass i będziesz chciał je wywołać.

Co więcej, nie możesz po prostu rzutować ich z jednego typu na inny, tak jak w przypadku typów natywnych (takich jak łańcuchy, liczby całkowite itd.). W takich sytuacjach musisz być w stanie rzutować standardową klasę PHP na określony typ.

A oto funkcja, która Ci w tym pomoże.

Rzutuj klasę standardową PHP na określony typ

W tym przykładzie załóżmy, że:

  1. Mam klasę, która znajduje się w przestrzeni nazw jako AcmeModelProduct.
  2. W pewnym momencie jest zapisywany w bazie danych WordPressa, ale po pobraniu jest ustawiany jako instancja stdClass.
  3. Potrzebuję, aby nieserializowana wersja obiektu była wersją Product.

W tym celu mam do dyspozycji następującą funkcję, którą wrzucam do projektów , gdy tego potrzebuję:

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

Jasne, funkcja jest skomentowana tak szczegółowo, jak mogę podać, ale jest kilka rzeczy, które mogę wyjaśnić nieco dokładniej w kontekście postu niż w kontekście komentarza do kodu.

Zrozumienie Kodeksu

Po pierwsze, ważne jest, aby upewnić się, że rozumiesz następujące funkcje PHP (wszystkie są dobrze zdefiniowane w podręczniku PHP):

  • unserializować. Tworzy wartość PHP z przechowywanej reprezentacji.
  • sprintf. Zwróć sformatowany ciąg
  • strlen. Uzyskaj długość ciągu
  • strstr. Znajdź pierwsze wystąpienie ciągu.
  • serializować. Generuje możliwą do przechowywania reprezentację wartości.

Więc tak, przychodząca instancja klasy jest pobierana, a następnie rzutowana jako określony typ, ale jak powyższe funkcje odgrywają w tym rolę? Ma to związek ze sposobem serializacji klasy w bazie danych WordPress.

Weźmy na przykład następujący ciąg:

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

Wiem – przeglądanie nie jest przyjemnością, ale dokładnie tak WordPress serializuje obiekt. Ponadto, gdy jest pobierany z bazy danych, jest to robione, a następnie zwracane jako instancja stdClass, a nie jako instancja typu, w którym była przed zapisaniem.

W tym miejscu w grę wchodzi powyższa funkcja. Aby przywrócić go do jego typu transakcji, musisz go przesłać jako taki. Aby to zrobić, możesz po prostu wykonać następujące czynności:

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

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

Zauważ, że pobieram obiekt, który został zserializowany do tabeli opcji. Nie zastanawiam się, czy powinieneś to zrobić, czy nie, to jest na przykład w celach.

Po drugie, zauważ, że wywołuję rzutowanie na instancję $this, więc $this może być instancją klasy lub może być metodą w klasie bazowej. Nie ma to znaczenia (o ile ten ostatni jest oznaczony jako chroniony ).

Stamtąd masz teraz instancję klasy, którą pierwotnie zapisałeś, ze wszystkimi dostępnymi dla ciebie informacjami, tak jak podczas pierwszego zapisania.

Źródło nagrywania: tommcfarlin.com

Ta strona korzysta z plików cookie, aby poprawić Twoje wrażenia. Zakładamy, że nie masz nic przeciwko, ale możesz zrezygnować, jeśli chcesz. Akceptuję Więcej szczegółów