第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

使用其他 XML 源擴展 SimpleXML 類

使用其他 XML 源擴展 SimpleXML 類

PHP
達令說 2023-10-15 16:34:32
對于當前的項目來說,如果能夠擴展 SimpleXML 類來訪問 SimpleXML 可遍歷的魔力,那就太棒了。由于我無法理解的原因,構(gòu)造函數(shù)是最終的。無論如何,我該如何延長課程呢?到目前為止,我所做的是避免在子類上使用構(gòu)造函數(shù),而是創(chuàng)建一個靜態(tài)方法來返回一個 XML 字符串,該字符串可在調(diào)用者中用于構(gòu)造對象。不太漂亮,因為它給調(diào)用者帶來了應(yīng)該隱藏的模式的負擔,但它正在起作用。是否有更優(yōu)雅的方法來避免最終構(gòu)造函數(shù)的阻礙設(shè)計選擇?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條經(jīng)驗 獲得超6個贊

SimpleXMLElement 上的構(gòu)造函數(shù)不僅僅是初始化 PHP 對象,而是調(diào)用外部庫來初始化一些內(nèi)部內(nèi)存結(jié)構(gòu),然后在您遍歷 XML 文檔或片段時重用這些內(nèi)部內(nèi)存結(jié)構(gòu)。

擴展類的一種受支持的方法是將類的名稱作為第二個參數(shù)傳遞給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在這種情況下有一個自定義構(gòu)造函數(shù)會發(fā)生什么:是否應(yīng)該為每個子元素調(diào)用它?有何論據(jù)?


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


class SubXML extends SimpleXMLElement {

? ?public static function createXMLfromDB($db) {

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

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

? ?}

}

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


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類,甚至可以將類名作為參數(shù)并將其傳遞給simplexml_load_string。


查看完整回答
反對 回復(fù) 2023-10-15
  • 1 回答
  • 0 關(guān)注
  • 121 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號