2014-02-26 59 views
0

我寫了下面的類來使某些DOM操作更容易。我希望Easy_Dom_Element的函數能夠接受一個字符串和一個元素作爲輸入。爲此,我必須訪問DOMDocument的createElement方法。對Easy_Dom :: toElement的調用可以正常工作,但該方法中的$ this指向Easy_Dom_Element,而不是Easy_Dom本身。我嘗試了一個靜態調用createElement,如下所示:Easy_Dom::createElement($element)但由於某些原因,這是不允許的。從DOMElement引用DOMDocument方法

class Easy_Dom extends DOMDocument{ 

    /*function __construct(){ 
     $this->registerNodeClass('DOMElement', 'Easy_Dom_Element'); 
    }*/ 

    //Gets the first element by tag name 
    function getElement($tagName){ 
     return $this->getElementsByTagName($tagName)->item(0); 
    } 

    //Creates DOMElement from string if needed 
    function toElement($element){ 
     if(is_string($element))$element = $this->createElement($element); 
     return $element; 
    } 
} 

class Easy_Dom_Element extends DOMElement{ 
    function prependChildEl($element){ 
     $element = Easy_Dom::toElement($element); 
     $this->insertBefore($element, $this->firstChild); 
     return $element; 
    } 

    function appendChildEl($element){ 
     $element = Easy_Dom::toElement($element); 
     $this->appendChild($element); 
     return $element; 
    } 
} 

$_testxml = new Easy_Dom('1.0', 'ISO-8859-1'); 
$_testxml->registerNodeClass('DOMElement', 'Easy_Dom_Element'); 

//load defaults 
$_testxml->load('default.xml'); 

//test above classes 
$test = $_testxml->getElement('general_title'); 
$test->appendChildEl('test'); 
echo $test->nodeValue; 
echo $_testxml->saveXML(); 

回答

1

就在我正要放棄這個我終於想通了,原來答案是很簡單的。

只是參考使用一個DOMElement的DOM文檔的ownerDocument屬性是這樣的:

$DOMDocumentFunctionResult = $this->ownerDocument->DOMDocumentFunction(); 

所以在我的例子:

class Easy_Dom extends DOMDocument{ 

    /*function __construct(){ 
     $this->registerNodeClass('DOMElement', 'Easy_Dom_Element'); 
    }*/ 

    //Gets the first element by tag name 
    function getElement($tagName){ 
     return $this->getElementsByTagName($tagName)->item(0); 
    } 

    //Creates DOMElement from string if needed 
    function toElement($element){ 
     if(is_string($element))$element = $this->createElement($element); 
     return $element; 
    } 
} 

class Easy_Dom_Element extends DOMElement{ 
    function prependChildEl($element){ 
     $element = $this->ownerDocument->toElement($element); 
     $this->insertBefore($element, $this->firstChild); 
     return $element; 
    } 

    function appendChildEl($element){ 
     $element = $this->ownerDocument->toElement($element); 
     $this->appendChild($element); 
     return $element; 
    } 
} 
0

您使用的是哪個版本的PHP?

< PHP 5.3不允許調用繼承類的靜態方法。

請參見:http://uk3.php.net/lsb

+0

我使用的版本,28年3月5日。靜態調用給我的錯誤是:致命錯誤:非靜態方法DOMDocument :: createElement()不能靜態調用,假設$ this來自不兼容的上下文中... – NotABlueWhale

相關問題