0

从维护和代码组织的角度来看,在 PHP5 中,为来自 Web 服务的 XML 数据创建/定义对象和类是否有意义?

Twitter 的 API为例,我将为每个 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,则需要在第一个设计中更新相应的类。
4

3 回答 3

1

我认为这取决于您的项目...

第一个设计:

  • 严格遵循面向对象的原则
  • 似乎是一种更适合编译语言的方法
  • 在大型应用程序中是必需的
  • 易于重复使用
  • 在传递数据时受益
  • 您有添加功能的方法,而不仅仅是数据

第二种设计:

  • 如果 API 被修改,需要的维护会少很多。如果 API 将属性添加到 XML,则需要在第一个设计中更新相应的类。
  • 直接和快速的解决方案
  • 小代码
于 2009-08-26T17:34:49.007 回答
1

我支持 Philippe:如果您的应用程序非常小(例如仅调用状态方法),请使用解决方案 2。

我同意首先创建一堆类来回显状态信息并不是真正需要的。但是,如果您的应用程序非常庞大,请在设计时考虑到解决方案 1。随着您的开发,您将创建属于特定类的特定方法。有时您想创建一种方法来“订购”状态消息。谁知道?这就是我们创建类的原因,每个类都有自己的职责,因此您无需搜索包含数百个函数的大型 php 文件。

我确实相信,如果您不知道您的应用程序将如何增长,那么“两全其美”的方法将是为至少每个 Twitter 类别(时间线、状态、用户等)创建类,总计可能 12 ),而不是每种方法。如果您不想创建太多类,IMO 在您的情况下是一个很好的解决方案。

于 2009-08-26T20:19:46.630 回答
0

如果您在 PHP5 中使用 XML,那么我认为最好的方法是使用 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();

上面的例子只是为了展示如何扩展类。如果您想了解更多信息,可以查看我在 Google Code上创建的库中的 XML 类

于 2009-08-26T23:45:39.150 回答