[英]Passing variables from methods to methods inside a class
我需要使用数百个不同的通道来构建一个非常复杂的xml表。 为避免重复代码并以6k行结尾,我编码了两种方法,一种创建无内容的通道,另一种创建填充的通道。 这是我的代码,下面将解释我的问题:
class create_xml {
private $xml_file;
private $title;
private $content;
private $date;
private $backlink;
private $filename = "feed.xml";
public function __construct($title, $content, $date, $backlink) {
$this->title = $title;
$this->content = $content;
$this->date = $date;
$this->backlink = $backlink;
$this->xml_file = new DOMDocument('1.0', 'utf-8');
}
//Creates a new channel without any content
private function cless_channel($chan_name) {
$$chan_name = $this->xml_file->createElement($chan_name);
$$chan_name = $this->xml_file->appendChild($$this->chan_name);
}
//Creates a populated channel
private function popu_channel($chan_name, $content, $parent) {
$sub_chan = $this->xml_file->createElement($chan_name);
$sub_chan = $$parent->appendChild($title);
$sub_content = $this->xml_file->createTextNode($content);
$sub_content = $sub_chan->appendChild($sub_content);
}
private function gen_xml() {
$this->cless_channel("channelroot");
$this->popu_channel("channel_one", "a random content", "channelroot");
}
public function save_xml() {
$this->gen_xml();
//Saves xml document
return $xml_file->save($filename);
}
public function return_xml() {
$this->gen_xml();
//Returns xml content as str
return $xml_file->saveXML();
}
}
好吧,基本上我会同时调用这两个方法$ this-> cless_channel()和$ this-> popu_channel(),我正在使用动态变量将变量名从一种方法传递给另一种方法,但这显然行不通。 我需要的是在类属性和动态变量之间混合使用,以便能够将变量从方法传递到其他方法。 请注意,这段代码仅显示了两个节点,但是我将拥有更多节点,并且我认为声明数量不多的变量是非常好的习惯,因此,我也在寻找一种避免这种情况的方法,但是我想我可以用数组做到这一点。 到目前为止,让它开始工作将是一个很好的开始。 我尝试了很多不同的东西,但是没有一个起作用,所以我什至不去炫耀它们。
预先感谢您提供的任何帮助。
不确定我是否正确理解了这个问题,只是尝试一下。
这个变量变量没什么用。 可能会返回一个包含所有这些元素的数组,否则您将尝试通过变量变量访问这些元素。
或者,您可以改变该过程,然后将回调传递给skeleton方法,如果要向否则为空/默认元素的内容添加回调,它将“询问”该回调。
但是,如果速度不是最高优先级,则只需让创建空骨架的方法返回其创建的(最外层)元素,然后让填充了某些(空)元素的方法用其他数据“抓住”这些元素,想要“更改/扩充/更改。
类似于:
<?php
$foo = new Foo;
$foo->skeleton('A');
$foo->populate1('B', 'lalala'); // this doesn't necessarily have to be in the same class
echo $foo->asxml();
class Foo {
private $root;
public function __construct() {
$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;
$doc->formatOutput = true;
$this->root = $doc->appendChild( $doc->createElement('root') );
}
public function skeleton($name) {
$container = $this->root->ownerDocument->createElement($name);
// for brevity adding raw xml to the container element
$fragment = $this->root->ownerDocument->createDocumentFragment();
$fragment->appendXML("<foo/><bar/><baz/><data><point /><point /><point /></data>");
$container->appendChild($fragment);
return $this->root->appendChild($container);
}
public function populate1($name, $point1) {
$container = $this->skeleton($name);
$xpath = new DOMXPath($container->ownerDocument);
foreach( $xpath->query('./data/point[1]', $container) as $p) { // can be only one, but anyway...
$p->appendChild( $container->ownerDocument->createTextNode($point1) );
}
}
public function asxml() {
return $this->root->ownerDocument->saveXML();
}
}
版画
<?xml version="1.0"?>
<root>
<A>
<foo/>
<bar/>
<baz/>
<data>
<point/>
<point/>
<point/>
</data>
</A>
<B>
<foo/>
<bar/>
<baz/>
<data>
<point>lalala</point>
<point/>
<point/>
</data>
</B>
</root>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.