Модели данных в php - PullRequest
       7

Модели данных в php

1 голос
/ 28 января 2011

Я экспериментирую с очень малоизвестными моделями данных в php.Например, если у меня есть таблица с именем "model_attributes" в базе данных SQL.Это список всех доступных атрибутов для модели, над которой я работаю.Теперь я хочу, чтобы модель и другие модели могли извлекать функции из этого списка для извлечения данных из массива после загрузки данных в массив из конструктора.Вот пример в псевдокоде:

for each attributes as attribute
    create new function ( getAttributeName )

и

getAttributeName() 

return $this->_model_data['attribute_name'] 

Прежде всего, это хорошая практика?Это кажется организованным, но в то же время кажется немного грязным.Может быть, кто-то может дать мне несколько других советов о том, как обрабатывать большие модели данных в php.

Кроме того, если кто-то сделал что-то подобное, как я мог бы справиться с этим в phpDocs?

Ответы [ 2 ]

3 голосов
/ 28 января 2011

Вы не сможете сделать это легко во время выполнения с PHP.

Вы можете использовать существующий ORM, например Doctrine или Propel .

Или вы можете предварительно сгенерировать файлы классов модели или использовать магические методы .

Быстрый пример:

class something {

    private $_model_data;

    public function __call($name, $value = null) {
        if (strpos($name, 'get') === 0) {
            $attribute = substr($name, 3);
            return $this->_model_data[$attribute];
        } else if (strpos($name, 'set') === 0) {
            $attribute = substr($name, 3);
            $this->_model_data[$attribute] = $value;
        }
    }
}

__call - это магияметод, который вызывается, когда метод не существует.Таким образом, вызов getAttributeName для экземпляра класса вызовет __call со строкой getAttributeName в качестве первого аргумента.

0 голосов
/ 28 января 2011

Если вы просто хотите получить доступ к массиву model_data из контекста объекта-контейнера, вам следует использовать магический метод __get или реализовать ArrayAccess интерфейс.

__get - это простой выход, так как реализация будет выглядеть примерно так:

function __get($name)
{
  if (array_key_exists($name, $this->model_data))
  {
    return $this->model_data[$name];
  }
  return;
}

Чтобы получить доступ к данным, достаточно просто вызвать свойство объекта: $obj->property_name или в случае, если вы используете строку: $obj->{$property} Конечно, это может помешать любым вашим общедоступным атрибутам (как правило, в любом случае плохая идея иметь их).

В качестве альтернативы вы можете настроить свой объект как реализацию ArrayAccess, которая позволит вам получить доступ к свойству как: $obj['property_name'] или $obj[$property]

Оба решения позволят вам иметь настраиваемое управление доступом, если вы хотите скрыть имена полей или настроить способ получения данных позже.

AFAIK метод ArrayAccess работает быстрее, но вам необходимо проверить его, чтобы быть уверенным. Магические методы имеют тенденцию быть немного медленными.

...