2009-08-26 55 views
0

從維護和代碼組織的角度來看,在PHP5中,爲來自Web服務的XML數據創建/定義對象和類是否有意義?在PHP中創建類或僅使用關聯數組來處理XML數據?

Twitter's 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添加屬性,則需要在第一個設計中更新相應的類。

回答

1

我想這取決於你的項目...

首先設計:

  • 嚴格按照面向對象原則
  • 似乎是一種方法更適合編譯語言
  • 必要的大應用
  • 易於重用
  • 傳遞數據時左右
  • 你有方法來添加功能中受益,而不僅僅是數據

二設計:

  • 很多的維修會如果API被修改則需要。如果API向XML添加屬性,則需要在第一個設計中更新相應的類。
  • 直截了當&快速的解決方案
  • 小碼
+0

您能否擴展「在大型應用程序中的必要性」?這將是MVC應用程序中的一個庫,其中數據源是Web服務而不是數據庫。這些模型將會是調用數據庫的庫,所以我認爲添加功能的重用/方法將成爲模型的一部分。 – jimyi 2009-08-26 17:50:11

+0

如果您的應用程序很大(您有很多文件,類,功能,數據等),您想要將這些部分彼此分開以便進行代碼可維護性和代碼重用問題。 – 2009-08-26 22:06:44

1

我與菲利普:如果您的應用程序將是非常小(只調用例如狀態的方法),去解決方案2.

我同意創建一堆類只是爲了回顯狀態信息並不是真的需要擺在首位。但是,如果您的應用程序將會非常龐大​​,請考慮解決方案1。隨着您的開發,您將創建屬於特定類的特定方法。有時候你想創建一個方法來「排序」狀態消息。誰知道?這就是爲什麼我們創建類,每個類都有自己的責任,所以你不需要搜索一個包含數百個函數的大型php文件。

我確實相信,如果您不知道應用程序將如何發展,那麼「兩全其美」的方法就是至少爲每個Twitter類別(時間軸,狀態,用戶等)創建類,總計可能是12),而不是每種方法。如果你不想創建太多類,那麼在你的情況下,IMO是一個很好的解決方案。

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(); 

上面的例子只是爲了說明如何擴展的類。如果您想了解更多信息,您可以查看XML class from a library I've created on Google代碼