✅ WEB ja WordPressi uudised, teemad, pistikprogrammid. Siin jagame näpunäiteid ja parimaid veebisaidi lahendusi.

Lihtne viis PHP standardklassi konkreetsesse tüüpi ülekandmiseks

13

Kui töötate WordPressis objektorienteeritud PHP-ga ja loote erinevaid mudeleid, mis sobivad teie veebirakendustega, on tõenäoline, et hakkate mingil hetkel programmi täitmise ajal tegelema nende mudelite jadaversioonide hankimisega.

Siin on aga asi: mõnikord tulevad seeriata andmed tagasi tavaliste PHP klassidena. See tähendab, et kui uurite tüüpi (erinevate silumistööriistade kaudu), näete, et tegemist on stdClassi tüübiga.

Kui olete oma mudeleid õigesti üles ehitanud, on teie koodil funktsioone, mida stdClassil pole, ja soovite neid kasutada.

Lisaks ei saa te neid lihtsalt ühest tüübist teise üle kanda, nagu saate teha omatüüpidega (nt stringid, täisarvud jne). Sellistes olukordades peate suutma PHP standardklassi konkreetsele tüübile üle kanda.

Ja siin on funktsioon, mis aitab teil seda teha.

Kandke PHP standardklassist kindlasse tüüpi

Selle näite puhul eeldage järgmist.

  1. Mul on klass, mille nimeruum on AcmeModelProduct.
  2. Mingil hetkel salvestatakse see WordPressi andmebaasi, kuid laadimisel määratakse see stdClassi eksemplariks.
  3. Mul on vaja, et objekti mitteseeriaversioon oleks toote versioon.

Selleks on mul saadaval järgmine funktsioon, mida ma vajadusel projektidesse lülitan:

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

Muidugi on funktsiooni kommenteeritud nii üksikasjalikult, kui ma suudan, kuid on mõnda asja, mida saan postituse kontekstis selgitada veidi rohkem kui koodikommentaari kontekstis.

Koodeksi mõistmine

Esiteks on oluline veenduda, et mõistate järgmisi PHP funktsioone (kõik need on PHP käsiraamatus täpselt määratletud):

Niisiis, jah, klassi sissetulev eksemplar tuuakse välja ja seejärel kantakse kindlaks määratud tüübina, kuid kuidas ülaltoodud funktsioonid selles rolli mängivad? See on seotud sellega, kuidas klass WordPressi andmebaasi järjestatakse.

Võtke näiteks järgmine string:

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

Ma tean – seda pole just rõõm vaadata, aga täpselt nii teeb WordPress objekti serialiseerimise. Veelgi enam, kui see tuuakse andmebaasist välja, tehakse seda ja tagastatakse seejärel stdClassi eksemplarina, mitte selle tüübi eksemplarina, mis oli enne salvestamist.

Siin tulebki mängu ülaltoodud funktsioon. Selle tehingutüübi taastamiseks soovite selle sellisena üle kanda. Ja selleks saate lihtsalt teha järgmist.

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

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

Pange tähele, et ma toon objekti, mis on suvandite tabelisse serialiseeritud. Ma ei taha väita, kas peaksite seda tegema või mitte, see on näiteks eesmärkidel.

Teiseks pange tähele, et ma kutsun cast’i $this eksemplarile, nii et $this võib olla klassi eksemplar või see võib olla baasklassi meetod. See ei oma tähtsust (kui viimane on märgitud kaitstuks ).

Sealt edasi on teil nüüd algselt salvestatud klassi eksemplar koos kogu teile kättesaadava teabega, nagu see oli selle esmakordsel salvestamisel.

See veebisait kasutab teie kasutuskogemuse parandamiseks küpsiseid. Eeldame, et olete sellega rahul, kuid saate soovi korral loobuda. Nõustu Loe rohkem