CascadiaPHP 2024

DOMImplementation sınıfı

(PHP 5, PHP 7, PHP 8)

Giriş

İşlemleri belli bir belge nesne modeli örneğinden bağımsız olarak gerçekleştirmek için bazı yöntemler sunan bir sınıf.

Sınıf Sözdizimi

class DOMImplementation {
/* Yöntemler */
public createDocument(?string $isimalanı = null, string $önekliAd = "", ?DOMDocumentType $belgeTürü = null): DOMDocument|false
public createDocumentType(string $belgeAdı, string $publicId = "", string $systemId = ""): DOMDocumentType|false
public hasFeature(string $özellik, string $sürüm): bool
}

İçindekiler

add a note

User Contributed Notes 1 note

up
6
LANGE.LUDO
9 years ago
Ok got it working like a charm using "proxy pattern" with traits. The idea being declaring the common methods inside a "trait" in order for extended and registered Node Classes to have access even if not derived / child of the extended DOMNode…

Here a small snippet :
<?php
namespace my;

trait
tNode
{ // We need the magic method __get in order to add properties such as DOMNode->parentElement
public function __get($name)
{ if(
property_exists($this, $name)){return $this->$name;}
if(
method_exists($this, $name)){return $this->$name();}
throw new
\ErrorException('my\\Node property \''.(string) $name.'\' not found…', 42, E_USER_WARNING);
}

// parentElement property definition
private function parentElement()
{ if(
$this->parentNode === null){return null;}
if(
$this->parentNode->nodeType === XML_ELEMENT_NODE){return $this->parentNode;}
return
$this->parentNode->parentElement();
}

// JavaScript equivalent
public function isEqualNode(\DOMNode $node){return $this->isSameNode($node);}
public function
compareDocumentPosition(\DOMNode $otherNode)
{ if(
$this->ownerDocument !== $otherNode->ownerDocument){return DOCUMENT_POSITION_DISCONNECTED;}
$c = strcmp($this->getNodePath(), $otherNode->getNodePath());
if(
$c === 0){return 0;}
else if(
$c < 0){return DOCUMENT_POSITION_FOLLOWING | ($c < -1 ? DOCUMENT_POSITION_CONTAINED_BY : 0);}
return
DOCUMENT_POSITION_PRECEDING | ($c > 1 ? DOCUMENT_POSITION_CONTAINS : 0);
}
public function
contains(\DOMNode $otherNode){return ($this->compareDocumentPosition($otherNode) >= DOCUMENT_POSITION_CONTAINED_BY);}
}

class
Document extends \DomDocument
{ public function __construct($version=null, $encoding=null)
{
parent::__construct($version, $encoding);
$this->registerNodeClass('DOMNode', 'my\Node');
$this->registerNodeClass('DOMElement', 'my\Element');
$this->registerNodeClass('DOMDocument', 'my\Document');
/* [...] */
}
}

class
Element extends \DOMElement
{ use tNode;
/* [...] */
}

class
Node extends \DOMNode
{ use tNode;
/* [...] */
}

?>
To Top