Ett enkelt sätt att skapa en PHP-standardklass till en specifik typ
Om du arbetar med objektorienterad PHP i WordPress och du bygger ut olika modeller som passar dina webbapplikationer, är oddsen att du kommer att ta itu med att hämta serialiserade versioner av dessa modeller någon gång under ett programs körning.
Men här är grejen: Ibland kommer oserialiserade data tillbaka som vanliga PHP-klasser. Detta betyder att om du inspekterar typen (genom olika felsökningsverktyg), kommer du att se att de är av typen stdClass.
Om du har byggt dina modeller ordentligt kommer din kod att ha funktioner som stdClass inte har, och du kommer att vilja använda dem.
Dessutom kan du inte helt enkelt casta dem från en typ till en annan som du kan med inbyggda typer (som strängar, heltal och så vidare). I sådana situationer måste du kunna casta en PHP-standardklass till en specifik typ.
Och här är en funktion som hjälper dig att göra just det.
Kasta en PHP en standardklass till en specifik typ
För det här exemplet, anta följande:
- Jag har en klass som är namnrymd som AcmeModelProduct.
- Den sparas vid något tillfälle i WordPress-databasen men när den hämtas ställs den in som en instans av stdClass.
- Jag behöver den oserialiserade versionen av objektet som är produktens.
För det ändamålet har jag följande funktion tillgänglig som jag släpper in i projekt när jag behöver den:
<?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), '"'), ':')
));
}
Visst, funktionen kommenteras med så mycket detaljer som jag kan ge, men det finns några saker jag kan förklara lite längre i ett inläggskontext än vad jag kan i en kodkommentar.
Förstå koden
Först är det viktigt att se till att du förstår följande PHP-funktioner (som alla är väldefinierade i PHP-manualen):
- unserialisera. Skapar ett PHP-värde från en lagrad representation.
- sprintf. Returnera en formaterad sträng
- strlen. Få stränglängd
- strstr. Hitta den första förekomsten av en sträng.
- serialisera. Genererar en lagringsbar representation av ett värde.
Så, ja, den inkommande instansen av klassen hämtas och castas sedan som den angivna typen men hur spelar ovanstående funktioner en roll i detta? Det har att göra med hur en klass serialiseras till WordPress-databasen.
Ta till exempel följande sträng:
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";}
Jag vet – det är inte precis ett nöje att recensera, men det är precis hur WordPress serialiserar ett objekt. Vidare, när det hämtas från databasen, görs det och returneras sedan som en stdClass- instans, inte som en instans av den typ som den var innan den sparades.
Det är där ovanstående funktion kommer in i bilden. För att återställa den till sin dealtyp, vill du casta den som sådan. Och för att göra det kan du helt enkelt göra följande:
<?php
$exampleObject = get_option('acmeModelProject', null);
if (null === $exampleObject) {
return;
}
$exampleObject = $this->cast($exampleObject, 'AcmeModelProduct');
Observera att jag hämtar ett objekt som har serialiserats till alternativtabellen. Jag argumenterar inte för om du ska göra detta eller inte, detta är till exempel syften.
För det andra, notera att jag anropar cast på en instans av $this så $this kan vara en instans av en klass eller det kan vara en metod i basklassen. Det spelar ingen roll (så länge det senare är markerat som skyddat ).
Därifrån har du nu en instans av klassen som du ursprungligen sparade med all information som var tillgänglig för dig som det var när du först sparade den.