See Release Notes
Long Term Support Release
<?php declare(strict_types=1); namespace GeoIp2\Record; abstract class AbstractRecord implements \JsonSerializable {> /** private $record; > * @var array<string, mixed> > *//** * @ignore */ public function __construct(?array $record) { $this->record = isset($record) ? $record : []; } /** * @ignore> * */ > * @return mixedpublic function __get(string $attr) { // XXX - kind of ugly but greatly reduces boilerplate code $key = $this->attributeToKey($attr); if ($this->__isset($attr)) { return $this->record[$key];< } elseif ($this->validAttribute($attr)) {> } > if ($this->validAttribute($attr)) {if (preg_match('/^is_/', $key)) { return false; } return null; }>throw new \RuntimeException("Unknown attribute: $attr"); } public function __isset(string $attr): bool {< return $this->validAttribute($attr) && < isset($this->record[$this->attributeToKey($attr)]);> return $this->validAttribute($attr) > && isset($this->record[$this->attributeToKey($attr)]);} private function attributeToKey(string $attr): string { return strtolower(preg_replace('/([A-Z])/', '_\1', $attr)); } private function validAttribute(string $attr): bool {> // @phpstan-ignore-next-linereturn \in_array($attr, $this->validAttributes, true); } public function jsonSerialize(): ?array { return $this->record; } }