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。
- 1 回答
- 0 關(guān)注
- 121 瀏覽
添加回答
舉報