note 116087 added to class.domimplementation
| From: | LANGE.LUDO | Date: | Fri, 07 Nov 2014 18:05:53 +0000 |
| Subject: | note 116087 added to class.domimplementation | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-200842@lists.php.net to get a copy of this message | ||
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;
/* [...] */
}
?>
----
Server IP: 72.52.91.14
Probable Submitter: 83.99.17.74
----
Manual Page -- http://php.net/manual/en/class.domimplementation.php
Edit -- https://master.php.net/note/edit/116087
Del: integrated -- https://master.php.net/note/delete/116087/integrated
Del: useless -- https://master.php.net/note/delete/116087/useless
Del: bad code -- https://master.php.net/note/delete/116087/bad+code
Del: spam -- https://master.php.net/note/delete/116087/spam
Del: non-english -- https://master.php.net/note/delete/116087/non-english
Del: in docs -- https://master.php.net/note/delete/116087/in+docs
Del: other reasons-- https://master.php.net/note/delete/116087
Reject -- https://master.php.net/note/reject/116087
Search -- https://master.php.net/manage/user-notes.php