2014-03-31 49 views
0

我需要构建一个包含数百个不同通道的非常复杂的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(); 
    } 
} 

好吧所以basicaly我打电话两种方法这个 - $> cless_channel()和$这个 - > popu_channel(),我m使用动态变量将变量名从一种方法传递给另一种,但显然不起作用。 我需要的是混合类属性和动态变量,以便能够将方法中的变量传递给其他方法。请注意,此代码只显示两个节点,但我会有更多,我不认为声明尽可能多的变量,因为渠道是非常好的做法,所以我也在寻找一种方法来避免这种情况,但我想我可以用数组来做到这一点。到目前为止,让这个工作成为一个很好的开始。 我尝试了一堆不同的东西,他们都没有工作,所以我甚至不打算把它们展示出来。

非常感谢您提供任何形式的帮助。

回答

0

不太确定,如果我正确理解问题,但只是试一试。
这个变量变量thingy不起作用。这将有可能返回一个数组,其中包含所有那些您将尝试通过变量变量访问的元素。
或者您可以转向这个过程并将回调传递给骨架方法,该方法在“要求”回调的情况下,如果有东西要添加到其他空/默认元素。
但是,如果速度不是最高优先级,那么只需让创建空骨架的方法返回它创建的(最外层)元素,然后让用附加数据填充某些(空)元素的方法“抓住”这些元素它“想要”改变/增加/改变。
沿着线的东西:

<?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> 
+0

它没有真的,我首先要找的答案(我已经能够解决我的代码以数组作为你的建议虽然),但你的代码看起来更接近我想达到的目标,所以我想我会和你一起去的。非常感谢你,你刚刚从一个蹩脚的夜晚救了我,试图弄清楚这一点! – bastienbot