Создание классов или просто использование ассоциативных массивов для XML-данных в PHP? - PullRequest
0 голосов
/ 26 августа 2009

С точки зрения обслуживания и организации кода, в PHP5 имеет ли смысл создавать / определять объекты и классы для данных XML, поступающих из веб-службы?

Используя в качестве примера API Twitter , у меня будет класс для каждого метода API (статусы, пользователи, direct_messages и т. Д.). Для statuses/public_timeline у меня было бы что-то вроде этого:

class Statuses {
    public $status = array(); // an array of Status objects
    public function __construct($url) { // load the xml into the object }
}

class Status {
    public $created_at, $id, $text; // and the rest of the attributes follow...
}

$public_timeline = new Statuses('http://twitter.com/statuses/public_timeline.xml');
echo $public_timeline->status[0]->text;

Или лучше свалить все в ассоциативный массив, чтобы к элементам обращались так:

// the load_xml function is just something that will dump xml into an array
$public_timeline = load_xml('http://twitter.com/statuses/public_timeline.xml');
echo $public_timeline['statuses']['status'][0]['text'];

Первый дизайн:

  • Строго следуя объектно-ориентированным принципам
  • Похоже, что подход лучше подходит для скомпилированных языков

Второй дизайн:

  • При изменении API потребуется гораздо меньше обслуживания. Если API добавляет атрибут в XML, соответствующий класс необходимо обновить в первом проекте.

Ответы [ 3 ]

1 голос
/ 27 августа 2009

Я с Филиппом: если ваше приложение будет очень маленьким (например, просто вызовите методы состояния), перейдите к решению 2.

Я согласен с тем, что создание группы классов только для отображения информации о состоянии в действительности не требуется. Но если ваше приложение будет огромным, проектируйте с учетом решения 1. По мере развития, вы будете создавать конкретные методы, которые будут принадлежать конкретным классам. Иногда вы хотели бы создать метод для «заказа» сообщений о состоянии. Кто знает? Вот почему мы создаем классы, каждый из которых несет свою ответственность, поэтому вам не нужно искать большой php-файл с сотнями функций.

Я верю, что если вы не знаете, как будет развиваться ваше приложение, подход «лучший из двух миров» будет создавать классы, по крайней мере, для каждой категории Twitter (временная шкала, статус, пользователь и т. Д., в сумме может быть 12) вместо каждого метода. Является хорошим решением IMO в вашем случае, если вы не хотите создавать слишком много классов.

1 голос
/ 26 августа 2009

Я думаю, это зависит от вашего проекта ...

Первый дизайн:

  • Строго следуя объектно-ориентированным принципам
  • Похоже, что подход лучше подходит для компилируемых языков
  • Необходим в большом приложении
  • Простота повторного использования
  • Преимущество при передаче данных вокруг
  • У вас есть методы для добавления функциональности, а не только данные

Второй дизайн:

  • При изменении API потребуется гораздо меньше обслуживания. Если API добавляет атрибут в XML, соответствующий класс необходимо обновить в первом проекте.
  • Прямое и быстрое решение
  • Маленький код
0 голосов
/ 27 августа 2009

Если вы работаете с XML в PHP5, то я думаю, что лучше всего было бы использовать SimpleXML. Тогда у вас есть лучшее из обоих миров. Вы можете получить доступ к своим значениям очень как массив . Однако вы можете расширить класс SimpleXML для предоставления методов и других настраиваемых элементов.

// To get the effect of an array...
$twitte = 'http://twitter.com/statuses/public_timeline.xml';
$public_timeline = simplexml_load_file($twitte);
echo $public_timeline->statuses->status;

Или расширить класс SimpleXml

class MyXml extends SimpleXml
{    
    public function quickStatus()
    {
        $status = $this->xpath("/statuses/status");
        return (string)$status[0];
    } 
}

// then access like
$twitte = 'http://twitter.com/statuses/public_timeline.xml';
$public_timeline = simplexml_load_file($twitte, 'MyXml');
echo $public_timeline->quickStatus();

Приведенный выше пример просто показывает, как расширить класс. Если вам нужна дополнительная информация, вы можете проверить класс XML из библиотеки, которую я создал в Google Код

...