DOMElement nesneyi uzatın

3 Cevap php

Nasıl Belge Nesnesi Modeli ile sağlanan nesneleri genişletmek olabilir? Yolu yok gibi görünüyor 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');

Ben bir hata var:

Warning: DOMElement::getAttribute(): Couldn't fetch Application_Model_XmlSchema in C:\Nevermind.php on line newvermind

3 Cevap

getAttribute önce DOMElement tanımlanır kurdukları için, __call kullanılmayacaktır. Sonuç olarak, yapılan tüm çağrılar Application_Model_XmlSchema::getAttribute DOMElement::getAttribute Sorunun sonuçlanan miras yoluyla gidecek.

Hızlı bir çözüm sınıfı tanımından extends DOMElement kurtulmak ve bu işlevselliği gerekiyorsa güzergah sihirli yöntemler ile DOMElement yöntemleri / özellikleri yoluyla aramaları almak olacaktır: bir olarak sınıf hareket var yerine çocuk daha sarıcı.

Bunu deneyin: http://www.php.net/manual/en/domdocument.registernodeclass.php

Benim DOMDocument genişletilmiş sınıfta kullanmak ve bana DOMNode ve DOMElement yöntemleri eklemek için izin, harika çalışıyor.

Geçici çözüm:

$xmlSchema->getSchema()->getAttribute('version');

Ama yöntemleri kullanılması "normal" erişim istiyorum.