亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用其他 XML 源擴展 SimpleXML 類

使用其他 XML 源擴展 SimpleXML 類

PHP
達令說 2023-10-15 16:34:32
對于當前的項目來說,如果能夠擴展 SimpleXML 類來訪問 SimpleXML 可遍歷的魔力,那就太棒了。由于我無法理解的原因,構造函數是最終的。無論如何,我該如何延長課程呢?到目前為止,我所做的是避免在子類上使用構造函數,而是創建一個靜態方法來返回一個 XML 字符串,該字符串可在調用者中用于構造對象。不太漂亮,因為它給調用者帶來了應該隱藏的模式的負擔,但它正在起作用。是否有更優雅的方法來避免最終構造函數的阻礙設計選擇?namespace acme.com;class SubXML extends \SimpleXML{   static public createXML() {        // here we return a magnificent XML string        // probably from a DB or a REST interface   }}$o = new \SubXML( \SubXML::createXML() );
查看完整描述

1 回答

?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

SimpleXMLElement 上的構造函數不僅僅是初始化 PHP 對象,而是調用外部庫來初始化一些內部內存結構,然后在您遍歷 XML 文檔或片段時重用這些內部內存結構。

擴展類的一種受支持的方法是將類的名稱作為第二個參數傳遞給simplexml_load_string或simplexml_load_file,這將在您遍歷時用于所有元素和屬性。例如:

class MyXML extends SimpleXMLElement {

? ? public function hello() { echo "Hello ", $this->getName(); }

}

$sx = simplexml_load_string('<foo><bar><baz>42</baz></bar></foo>', 'MyXML');

$sx->bar->baz->hello();

目前尚不清楚如果MyXML在這種情況下有一個自定義構造函數會發生什么:是否應該為每個子元素調用它?有何論據?


撇開這一點不談,您的實際要求似乎是擁有某種工廠,它從某個來源(數據庫、API)獲取數據并創建某種對象。您的靜態方法似乎是一個明智的方向,但可以直接返回對象而不是字符串:


class SubXML extends SimpleXMLElement {

? ?public static function createXMLfromDB($db) {

? ? ? ? $xmlString = $db->query('Select XML from SpecialTable');

? ? ? ? return simplexml_load_string($xmlString, static::class);

? ?}

}

但是,我認為繼承首先并不是表示這一點的特別好的方式 - 結果對象可能不需要知道其數據來自哪里,它需要能夠表示該數據。因此,您的工廠可以是一個完全不同的類,以更適合測試的方式管理其依賴項:


class MyXMLFromDBFactory {

? ? private MyDBWrapper $db;


? ? public function __construct(MyDBWrapper $db) {

? ? ? ? $this->db = $db;

? ? }


? ? public function createXML() {

? ? ? ? $xmlString = $db->query('Select XML from SpecialTable');

? ? ? ? return simplexml_load_string($xmlString);

? ? }

}

然后你可以有一個單獨的MyXMLFromAPIFactory,MyXMLFromFileOnAmazonS3Factory等。如果你愿意,這些都可以返回相同的擴展SimpleXMLElement類,甚至可以將類名作為參數并將其傳遞給simplexml_load_string。


查看完整回答
反對 回復 2023-10-15
  • 1 回答
  • 0 關注
  • 114 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號