PHP 8.5.0 RC 5 available for testing

The DOMImplementation class

(PHP 5, PHP 7, PHP 8)

Introduction

This class provides a number of methods for performing operations that are independent of any particular instance of the document object model.

Class synopsis

class DOMImplementation {
/* Methods */
public createDocument (? string $namespace = null , string $qualifiedName = "", ? DOMDocumentType $doctype = null ): DOMDocument
public createDocumentType (string $qualifiedName, string $publicId = "", string $systemId = ""): DOMDocumentType |false
public hasFeature (string $feature, string $version): bool
}

Table of Contents

Found A Problem?

Learn How To Improve This PageSubmit a Pull RequestReport a Bug
+add a note

User Contributed Notes 1 note

up
5
LANGE.LUDO
11 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;
 /* [...] */
 }
?>
+add a note

AltStyle によって変換されたページ (->オリジナル) /