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 上的引用计数器在函数调用结束时变为零。
如果将文档的创建和使用分开,这不会对您产生太大影响。在这种情况下,您将有一个带有文档对象的变量。
我正在尝试 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 上的引用计数器在函数调用结束时变为零。
如果将文档的创建和使用分开,这不会对您产生太大影响。在这种情况下,您将有一个带有文档对象的变量。