Для меня пример кода выглядит как «Мы хотим, чтобы все недостатки объекта сочетались со всем потенциалом неправильного использования массива»
Единственная причина, по которой я могу пойти на что-то подобное, - это когда вы начинаете рефакторинг из массивов в объекты.
Вы заменяете весь доступ ['']
на ->
, но ничего не ломаете, когда он снова компилируется.
На следующем шаге вы можете начать добавлять правила для определенных свойств.
public function __set($key, $val) {
if($key == "money") { throw new Exception("Can't touch this"); }
$this->data[$key] = $val;
}
public function __get($key, $val) {
if($key == "money") { return $this->x * $this->y; }
$this->data[$key] = $val;
}
Но в целом я не вижу никакой пользы в этом направлении. Создание реальных "объектов-значений" для ОО-структур данных кажется гораздо более полезным.
Делать что-то подобное просто ради "Мне нравится ->
лучше, чем ['']
, не является допустимым вариантом использования в моей книге."
Для большинства случаев использования «Объекты как структуры данных» я бы предпочел:
class SomeObject {
protected $a, $b, $c;
public function __construct(TypeA $a, TypeB $b, TypeC $c) {
$this->a = $a;
$this->b = $b;
$this->c = $c;
}
/** @return TypeA */
public function getA($key) {
return $this->a;
}
// an so on
}
Это документирует ожидаемые значения. Работает с подсказками нативного типа без необходимости писать, что вы и я - это то, что я ожидал бы получить как «структуру данных».
Если есть веская причина, по которой класс должен действовать как массив, тогда ArrayAccess
кажется мне гораздо лучшим выбором, чем такая магия.