扩展DOMElement对象

时间:2010-03-07 23:23:04

标签: php xml dom

如何扩展文档对象模型提供的对象?似乎没有办法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

3 个答案:

答案 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');

但我想使用“正常”访问方法。