如何扩展文档对象模型提供的对象?似乎没有办法according to this issue。
class Application_Model_XmlSchema extends DOMElement
{
const ELEMENT_NAME = 'schema';
/**
* @var DOMElement
*/
private $_schema;
/**
* @param DOMDocument $document
* @return void
*/
public function __construct(DOMDocument $document) {
$this->setSchema($document->getElementsByTagName(self::ELEMENT_NAME)->item(0));
}
/**
* @param DOMElement $schema
* @return void
*/
public function setSchema(DOMElement $schema){
$this->_schema = $schema;
}
/**
* @return DOMElement
*/
public function getSchema(){
return $this->_schema;
}
/**
* @param string $name
* @param array $arguments
* @return mixed
*/
public function __call($name, $arguments) {
if (method_exists($this->_schema, $name)) {
return call_user_func_array(
array($this->_schema, $name),
$arguments
);
}
}
}
$version = $this->getRequest()->getParam('version', null);
$encoding = $this->getRequest()->getParam('encoding', null);
$source = 'http://www.w3.org/2001/XMLSchema.xsd';
$document = new DOMDocument($version, $encoding);
$document->load($source);
$xmlSchema = new Application_Model_XmlSchema($document);
$xmlSchema->getAttribute('version');
我收到了一个错误:
警告:DOMElement :: getAttribute(): 无法取 Application_Model_XmlSchema in newvermind
上的C:\ Nevermind.php
答案 0 :(得分:3)
试试这个:http://www.php.net/manual/en/domdocument.registernodeclass.php
我在DOMDocument扩展类中使用它,它工作得很好,允许我向DOMNode和DOMElement添加方法。
答案 1 :(得分:1)
由于getAttribute
中已定义DOMElement
,因此您的__call
将不会被使用。因此,对Application_Model_XmlSchema::getAttribute
的任何调用都将通过继承的DOMElement::getAttribute
来解决您的问题。
快速解决方法是从类定义中删除extends DOMElement
并使用魔术方法将调用路由到DOMElement
方法/属性,如果您需要该功能:让您的类充当包装器而不是孩子。
答案 2 :(得分:0)
解决方法是:
$xmlSchema->getSchema()->getAttribute('version');
但我想使用“正常”访问方法。