Позвольте мне описать несколько способов, как вы могли бы сделать это.
ArrayObject с пользовательским кодом
ArrayObject
реализует все необходимые интерфейсы .
class DomainData extends ArrayObject
{
public $domainId;
public $color;
public function __construct($data = array())
{
parent::__construct($data);
foreach ($data as $key => $value) {
$this->$key = $value;
}
}
}
Хотя это не очень приятно; он дважды копирует ключи и значения, и изменение свойства не меняет базовый массив.
Реализация IteratorAggregate для get_object_vars ()
Если вы не возражаете отказаться от ArrayAccess
вы можете обойтись только с помощью реализации агрегатного итератора .
class DomainData implements IteratorAggregate
{
public $domainId;
public $color;
public function __construct($data = [])
{
foreach ($data as $key => $value) {
$this->$key = $value;
}
}
public function getIterator()
{
return new ArrayIterator(get_object_vars($this));
}
}
ArrayObject со свойством flag и делать c blocks
Лучшим способом было бы использовать выполните c блоки для описания ваших свойств (описано здесь ), а затем используйте флаг ARRAY_AS_PROPS
, чтобы представить массив как свойства.
/**
* Magic class
* @property int $domainId
* @property string $color
*/
class DomainData extends ArrayObject
{
function __construct($data = []) {
parent::__construct($data, parent::ARRAY_AS_PROPS);
}
}
При загрузке в PhpStorm вы увидел бы это: ![phpstorm editor](https://i.stack.imgur.com/AtVbv.png)