pronto.ee

Tomorrow will be cancelled due to lack of interest

PHP 8.3: json_validate()

Kuigi PHP 8.3 ei ilmu just homme (hetkel on see planeeritud selle aasta 23. novembriks) on aeg hakata kaema sellega kaasnevaid uuendusi. Esimeseks neist saab olema uus funktsioon json_validate().

PHP

JSON (JavaScript Object Notation) on avatud andmestandard mida on juba aastaid kasutatud andmete vahetamiseks ning salvestamiseks, mis on õhuke ning minimaalselt ressurssi nõudev ja ühes sellega päris paljudes kontekstides praeguseks asendanud XML-i. Praeguseks on nii, et kui mingid asjad peavad veebis omavahel andmeid vahetama, siis tavaliselt kasutavad nad selleks JSON formaati. Asjale muidugi aitab kaasa ka nüanss, et JSON on enam-vähem inimloetav, andmete kontrollimiseks ei ole seetõttu vaja eraldi tööriistu.

Samas on PHP-s JSON-ga seotud üks väike kuid tülikas probleem: nimelt selleks, et kontrollida andmeformaadi õigsust pidi varem andmed json_decode() abil objektiks konverteerima. Kui andmemahud olid piisavalt suured, siis tõstis see andmevahetuskihi jaoks nõudeid protsessorile või töötlemisajale, mis näiteks AWS-i puhul kippus kiiresti reaalseteks kuludeks muutuma. Sestap siis json_validate(), mille eesmärk on vaid andmeid kontrollida.

Funktsiooni signatuur näeb välja selline:

/**  
 * Validates a given string to be valid JSON.
 * 
 * @param string $json String to validate  
 * @param int $depth Set the maximum depth. Must be greater than zero.  
 * @param int $flags Bitmask of flags.  
 * @return bool True if $json contains a valid JSON string, false otherwise.  
 */  
function json_validate(string $json, int $depth = 512, int $flags = 0): bool {  
}

Kes tahab sellest funtksioonist rohkem teada saada vaadaku siia ja kui kedagi beaks huvitama bitmaski väärtused, siis selle info leiab siit.

Märkuseks veel niipalju, et seda funktsioon on võimalik polyfillida, ehk siis koodi on võimalik teha vanemate PHP versioonidega ühilduvaks kasutade järgmist meetodit:

if (!function_exists('json_validate')) {  
  function json_validate(string $json, int $depth = 512, int $flags = 0): bool {  
    if ($flags !== 0 && $flags !== \JSON_INVALID_UTF8_IGNORE) {  
      throw new \ValueError('json_validate(): Argument #3 ($flags) must be a valid flag (allowed flags: JSON_INVALID_UTF8_IGNORE)');  
    }  

    if ($depth <= 0 ) {  
      throw new \ValueError('json_validate(): Argument #2 ($depth) must be greater than 0');  
    }  

    \json_decode($json, null, $depth, $flags);  

    return \json_last_error() === \JSON_ERROR_NONE;  
  }  
}

See lahendus on hetkel PHP 8.0 ühilduv ning kui \ValueError asendada näiteks \Exception-ga, siis töötab see isegi PHP 7.3-ga. Sestap võib selle funktsioni juba praegu oma koodi lisada.

Post a comment