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。
- 1 回答
- 0 關注
- 114 瀏覽
添加回答
舉報