Helppo tapa lähettää PHP-standardiluokka tiettyyn tyyppiin
Jos työskentelet oliopohjaisen PHP:n kanssa WordPressissä ja rakennat erilaisia malleja, jotka sopivat verkkosovelluksiisi, on todennäköistä, että joudut hakemaan sarjamuotoisia versioita näistä malleista jossain vaiheessa ohjelman suorittamisen aikana.
Asia on kuitenkin tässä: Joskus sarjoittamattomat tiedot tulevat takaisin tavallisiksi PHP-luokiksi. Tämä tarkoittaa, että jos tarkastat tyypin (erilaisten virheenkorjaustyökalujen avulla), näet, että ne ovat stdClass -tyyppiä .
Jos olet rakentanut mallejasi oikein, koodissasi on toimintoja, joita stdClassissa ei ole, ja haluat käyttää niitä.
Lisäksi et voi yksinkertaisesti suoratoistaa niitä tyypistä toiseen, kuten voit tehdä natiivityypeillä (kuten merkkijonot, kokonaisluvut ja niin edelleen). Tällaisissa tilanteissa sinun on voitava lähettää PHP-standardiluokka tietylle tyypille.
Ja tässä on toiminto, joka auttaa sinua tekemään sen.
Välitä PHP vakioluokka tiettyyn tyyppiin
Tässä esimerkissä oletetaan seuraavaa:
- Minulla on luokka, jonka nimiväli on AcmeModelProduct.
- Se tallennetaan jossain vaiheessa WordPress-tietokantaan, mutta noudettaessa se asetetaan stdClass -esiintymäksi .
- Haluan, että objektin serialoimaton versio on Tuotteen versio .
Tätä tarkoitusta varten minulla on käytettävissä seuraava toiminto, jonka voin osallistua projekteihin tarpeen mukaan:
<?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), '"'), ':')
));
}
Toki toimintoa on kommentoitu niin yksityiskohtaisesti kuin voin tarjota, mutta on muutamia asioita, joita voin selittää hieman tarkemmin viestin yhteydessä kuin koodikommentin yhteydessä.
Koodin ymmärtäminen
Ensinnäkin on tärkeää varmistaa, että ymmärrät seuraavat PHP-toiminnot (jotka kaikki on määritelty hyvin PHP-oppaassa):
- peruuttaa sarja. Luo PHP-arvon tallennetusta esityksestä.
- sprintf. Palauta muotoiltu merkkijono
- strlen. Hanki merkkijonon pituus
- strstr. Etsi merkkijonon ensimmäinen esiintymä.
- sarjoittaa. Luo tallennettavan esityksen arvosta.
Joten kyllä, luokan saapuva ilmentymä haetaan ja sitten valetaan määritetyksi tyypiksi, mutta miten yllä olevat funktiot vaikuttavat tähän? Se liittyy siihen, kuinka luokka sarjoitetaan WordPress-tietokantaan.
Otetaan esimerkiksi seuraava merkkijono:
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";}
Tiedän – sitä ei ole aivan ilo arvostella, mutta se on täsmälleen miten WordPress sarjoi objektin. Lisäksi, kun se haetaan tietokannasta, se tehdään niin ja palautetaan sitten stdClass- esiintymänä, ei sen tyypin esiintymänä, joka oli ennen sen tallentamista.
Siellä yllä oleva toiminto tulee käyttöön. Jos haluat palauttaa sen sopimustyyppiin, se kannattaa lähettää sellaisenaan. Ja tehdäksesi sen, voit yksinkertaisesti tehdä seuraavan:
<?php
$exampleObject = get_option('acmeModelProject', null);
if (null === $exampleObject) {
return;
}
$exampleObject = $this->cast($exampleObject, 'AcmeModelProduct');
Huomaa, että haen objektia, joka on sarjoitettu asetustaulukkoon. En ota kantaa siihen, pitäisikö sinun tehdä tämä vai ei, tämä on esimerkiksi tarkoitus.
Toiseksi, huomaa, että kutsun castia $this -esiintymään, joten $this voi olla luokan esiintymä tai se voi olla perusluokan metodi. Sillä ei ole väliä (kunhan jälkimmäinen on merkitty suojatuksi ).
Sieltä sinulla on nyt alun perin tallentamasi luokan esiintymä, jossa on kaikki käytettävissäsi olevat tiedot sellaisena kuin se oli tallentaessasi sen.