2016-03-02 2 views
1

У меня есть класс оболочки для создания xml-файла, и я не знаю, как переписать метод add() для правильной работы. Переменная SHOPITEM должна быть родительским элементом, но я не знаю, как ее использовать в методе добавления.PHP Вызов неопределенного метода DOMElement

Любые советы приветствуются

class Items { 

    const XML_VERSION enter code here= '1.0'; 
    const XML_ENCODING = 'utf-8'; 
    const SHOP = 'SHOP'; 

    private $xml, $xmlElement; 

    public function __construct() { 
     $this->xml = new DOMDocument(self::XML_VERSION, self::XML_ENCODING); 
     //$this->xml->preserveWhiteSpace = false; 
     $this->xml->formatOutput = true; 
     $this->xmlElement = $this->create(self::SHOP); 
    } 

    public function create($nodeName, $value = null) { 
     return $this->xml->createElement($nodeName, $value); 
    } 

    public function add($object) { 
     return $this->xmlElement->appendChild($object); 
    } 

    public function write() { 
     $this->xml->appendChild($this->xmlElement); 
     $this->xml->save("test.xml"); 
    } 

} 

$items = new Items(); 
$SHOPITEM = $items->create('SHOPITEM'); 
$product1 = $items->create('Product1', 'Some value 1'); 
$product2 = $items->create('Product2', 'Some value 2'); 

//this wont work 
$SHOPITEM->add($product1); 

//this works 
$items->add($product1); 
$items->add($product2); 

//this works 
$items->add($SHOPITEM); 

$items->write(); 

ответ

0

Ваш $SHOPITEM, $product1 и $product2 являются экземплярами вновь добавленного узла (т.е. класса DOMElement), потому что они являются результатом заявления

return $this->xml->createElement($nodeName, $value); 

Таким образом, они просто do nat имеют метод add($object), который вы хотите использовать на них.

+0

Можете ли вы дать мне совет, пожалуйста, как переписать мой метод, так что я могу использовать метод добавления? – Rataja

+0

Насколько я понимаю логику, которую вы пытались реализовать (или, по крайней мере, это так), ваш класс 'Itmes' должен представлять XML-документ, который будет содержать один элемент' SHOP', который будет содержать некоторые другие элементы. Если это так, значит, у вас есть xmldoc с корневым элементом 'SHOP', а не только простые элементы в нем, ни один из них не будет узлами для хранения других элементов. Если все выше, чем вы намеревались, вы можете просто использовать метод 'add ($ object)' и предоставить для него некоторый 'DOMElement' в качестве аргумента. Вы можете использовать метод 'create' для создания таких элементов. – xmike

+0

И многое другое: если вам нравится работать с структурой xml через некоторую оболочку, чем искать ее, и реализовать оболочку, которая принимает только ваши абстракции, поэтому вы не имеете дело с DOMElemets при добавлении процесса или создании процесса или что-то еще. Если не так - используйте простые PHP-возможности для работы xml напрямую. Смешение обоих подходов сбивает с толку, потому что одна часть становится более абстрактной, чем другая. – xmike