1. Делают ли так?
Делают, но это не хорошая практика. Во первых имеете шанс затереть какие-то настроечные данные объекта и получить непредсказуемость поведения. Во вторых, если у вас там значения из бд или другого хранилища в формате ключ-значение, лучше хранить их в отдельном поле, том же дата, но в виде stdClass, чтобы не путать их при работе с хранилищем с остальными полями, например так:
public function setData(array $data):void{
$this->data = (object)$data;
}
в идеале у вас должен быть DTO (data transfer object), но в актив рекорд движках он обычно не используется.