Я хочу обнаружить различия в структурах dom и сравнить узлы. Поэтому я устанавливаю специальный атрибут объекта "uniqid" для каждого объекта DOMElement/DOMText.
Это работает:
<?php
class _1
{
public $DOMDocument = null;
public $DOMXpath = null;
public function __construct()
{
$this->DOMDocument = new \DOMDocument();
$this->DOMDocument->loadHTML('<div>foo</div>');
$this->DOMXpath = new \DOMXpath($this->DOMDocument);
$nodes = $this->DOMXpath->query('/html/body//node()');
$nodes_id = 1;
foreach ($nodes as $nodes__value) {
$nodes__value->uniqid = $nodes_id;
$nodes_id++;
}
var_dump(@$this->DOMXpath->query('/html/body//text()')[0]->uniqid);
}
}
$_1 = new _1();
// 2
Сейчас я просто вынес логику в отдельные функции:
<?php
class _2
{
public $DOMDocument = null;
public $DOMXpath = null;
public function __construct()
{
$this->DOMDocument = new \DOMDocument();
$this->DOMDocument->loadHTML('<div>foo</div>');
$this->DOMXpath = new \DOMXpath($this->DOMDocument);
$this->test1();
$this->test2();
}
public function test1()
{
$nodes = $this->DOMXpath->query('/html/body//node()');
$nodes_id = 1;
foreach ($nodes as $nodes__value) {
$nodes__value->uniqid = $nodes_id;
$nodes_id++;
}
}
public function test2()
{
var_dump(@$this->DOMXpath->query('/html/body//text()')[0]->uniqid);
}
}
$_2 = new _2();
// NULL
- Может кто-нибудь объяснить, почему _1 работает, а _2 нет?
- Как я могу безопасно «сохранить» атрибуты (не атрибуты dom) в объектах DOMDocument/DOMText для последующего доступа?
$this->DOMXpath->query('/html/body//text()')
вернет новый экземпляр результатов с исходными ссылками на объекты (без вашего уникального идентификатора) ТАКЖЕ, потому что вы не записываете сделанные вами изменения DOM, вы в основном снова запрашиваете исходный DOM - person jDolba   schedule 17.12.2019