PHP DOMDocument 对象突然不同class

PHP DOMDocument suddenly object of different class

我正在尝试 return DOMDocument ($doc->documentElement) 的根元素,然后访问 [=17= 的 public 成员 $foo ]. 这给了我

Undefined property: DOMDocument::$foo in /var/www/temp/test.php on line 16

因为在 return 根元素之后,成员 ownerDocument 不再是 class \test\DOMDocument 而是 \DOMDocument.

代码有什么问题?

(PHP 5.5.9-1ubuntu4.5123)

<?php
namespace test;

class DOMDocument extends \DOMDocument {
    public $foo = 'bar';
}

function test() {
    $doc = new DOMDocument();
    $doc->loadXML('<root></root>');
    echo $doc->documentElement->ownerDocument->foo; // bar
    return $doc->documentElement;
}

$doc = test();
echo $doc->ownerDocument->foo; // error: $foo is not defined

?>

ThW提出的方案

<?php
namespace test;

class DOMDocument extends \DOMDocument {
    public $foo = 'bar';
}

function test($doc) {
    echo $doc->documentElement->ownerDocument->foo; // bar
    return $doc->documentElement;
}

$doc = new DOMDocument();
$doc->loadXML('<root></root>');

$doc2 = test($doc);
echo $doc2->ownerDocument->foo; // bar

?>

这是 ext/dom GC 中的错误。您始终需要对文档对象的有效引用。如果不是,该对象可以将其 class 更改为 \DOMDocument 或完全从内存中删除。

您在函数内创建文档,return 仅创建文档元素节点,而非文档。 $doc 上的引用计数器在函数调用结束时变为零。

如果将文档的创建和使用分开,这不会对您产生太大影响。在这种情况下,您将有一个带有文档对象的变量。