最近中文字幕高清中文字幕无,亚洲欧美高清一区二区三区,一本色道无码道dvd在线观看 ,一个人看的www免费高清中文字幕

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

使用其他 XML 源擴(kuò)展 SimpleXML 類

使用其他 XML 源擴(kuò)展 SimpleXML 類

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

?
呼啦一陣風(fēng)

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊

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

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

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è)自定義構(gòu)造函數(shù)會(huì)發(fā)生什么:是否應(yīng)該為每個(gè)子元素調(diào)用它?有何論據(jù)?


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


class SubXML extends SimpleXMLElement {

? ?public static function createXMLfromDB($db) {

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

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

? ?}

}

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


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

? ? }

}

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


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

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