note 116087 added to class.domimplementation

From: 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

« previous php.notes (#200842) next »