我正在尝试使用下面的类生成一个xml文件,当传递没有深度约束的数组数据时,xml会被下面的代码成功生成。我只想弄清楚self::createNode($value, $child);
语句是如何工作的,它会创建一个新对象吗?类构造函数中parent::_construct
语句的意义是什么?因为编码已在子类构造函数中初始化。
我从现在开始读到的关于self关键字的是它用于调用静态方法,但是这里createNode方法是非静态的。有人能够帮助我理解这个语句的上下文,我在这里可以说的是DomDocument类根本没有任何createNode方法。有人能帮忙吗?
非常感谢你。
class array2xml extends DomDocument
{
public $nodeName;
private $xpath;
private $root;
private $node_name;
public $xml_data;
public function __construct($root='root', $node_name='node')
{
parent::__construct();
$this->encoding = "UTF-8";
$this->formatOutput = true;
$this->node_name = $node_name;
$this->root = $this->appendChild($this->createElement($root));
$this->xpath = new DomXPath($this);
}
public function createNode( $arr, $node = null)
{
if (is_null($node))
{
$node = $this->root;
}
foreach($arr as $element => $value)
{
$element = is_numeric( $element )
? $this->node_name
: $element;
$element = htmlspecialchars($element,ENT_QUOTES,'UTF-8');
$child = $this->createElement($element, (is_array($value)
? null
: htmlspecialchars($value,ENT_QUOTES,'UTF-8')));
$node->appendChild($child);
if (is_array($value))
{
self::createNode($value, $child);
}
}
}
public function __toString()
{
$this->xml_data= $this->saveXML();
return $this->saveXML();
}
}
答案 0 :(得分:1)
在PHP中self
始终是指执行self
的类。因此,在您的情况下,self
将引用类array2xml
中的方法。
通常self
用于调用static
方法。因为在您的情况下,self
调用的方法不是静态的,所以最好使用$this
代替。
parent
始终从“父”类调用该方法。所以扩展的类。同样在您调用parent::some function()
的情况下,它将在DomDocument
类中搜索该方法。因为那是“父”(扩展)类。
在parent::__construct()
类的构造函数中调用array2xml
的原因是因为当您自己的类也使用时,扩展类的构造函数是从不自动调用一个__construct()
。除非您的班级不有__construct()
。只有这样PHP才会调用父类的__construct()
。否则你必须从你自己的构造函数手动调用它。