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< * < * @param mixed $record*/< public function __construct($record)> public function __construct(?array $record){ $this->record = isset($record) ? $record : []; } /** * @ignore *< * @param mixed $attr> * @return mixed*/< public function __get($attr)> public 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($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($attr)> private function attributeToKey(string $attr): string{ return strtolower(preg_replace('/([A-Z])/', '_\1', $attr)); }< private function validAttribute($attr)> private function validAttribute(string $attr): bool{> // @phpstan-ignore-next-linereturn \in_array($attr, $this->validAttributes, true); }< public function jsonSerialize()> public function jsonSerialize(): ?array{ return $this->record; } }