将变量从方法传递到类中的方法

时间:2014-03-31 20:29:28

标签: php oop variables dynamic

我需要构建一个包含数百个不同频道的非常复杂的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(),我使用动态变量将变量名称从一个方法传递给另一个,但显然不起作用。 我需要的是在类属性和动态变量之间混合,以便能够将变量从方法传递到其他方法。请注意,此代码仅显示两个节点,但我还有更多节点,我不认为声明尽可能多的变量,因为有通道是非常好的做法,所以我也在寻找一种方法为了避免这种情况,但我想我可以用数组做到这一点。到目前为止,这项工作将是一个很好的开始。 我尝试了很多不同的东西,没有一个能够工作,所以我甚至都不打算把它们展示出来。

提前感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

我不太确定我是否正确理解了这个问题,但只是试一试 这个变量变量不行。可以返回一个数组,其中包含您尝试通过变量访问的所有元素 或者您可以转换进程并将回调传递给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>