2013-01-02 31 views
0

我想要生成一個XML文件使用下面的類,當一個數組數據傳遞沒有深度限制時xml成功由下面的代碼生成。我只是想弄清楚如何self::createNode($value, $child);聲明的作品創建一個新的對象?類構造函數中parent::_construct語句的意義是什麼?因爲編碼已經在子類構造函數中初始化了。 從現在開始我讀到關於self關鍵字的是它用來調用靜態方法,但這裏的createNode方法是非靜態的。有人能夠幫助我理解這個語句的上下文,我可以在這裏說的是DomDocument類根本沒有任何createNode方法。任何人都可以提供幫助嗎? 非常感謝。如何自我在一個孩子類正確工作在PHP

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(); 
    } 
} 
+2

請告訴我,你的代碼確實有縮進... – Charles

+0

嗨查爾斯是的它有縮進,它是在工作順序以及代碼沒有任何錯誤問題。 –

+0

嗨,我再次縮進它,因爲這是我第一次發佈問題。是不是8空格縮進代碼?對不起,我在這裏很愚蠢。 –

回答

1

在PHP self總是指的是self被執行的類。所以在你的情況下,self將參考類array2xml中的方法。

通常使用self來調用static方法。由於在你的情況下,self所調用的方法不是靜態的,所以使用$this代替它會更好。

其中parent總是從「父」類中調用該方法。所以擴展的類。同樣在你的情況下,當調用parent::some function()時,它將在DomDocument類中搜索該方法。因爲那是「父母」(擴展)班。

之所以parent::__construct()是所謂的array2xml類的構造函數,是因爲擴展類的構造函數是從未時候自動調用自己的類也使用了__construct()。除非你的班級有而不是__construct()。只有這樣PHP纔會調用父類的__construct()。否則,你必須從你自己的構造函數手動調用它。

+0

非常感謝你的幫助。 –

+0

w00調用self時,類對象的所有數據變量值將保持不變(例如,在代碼中)如果使用相同的類方法創建新對象,則會使用相同的值嗎? –

+0

@WajidAbbasi是的,假設'變量'是靜態的,那麼它對每個類的''實例'都是一樣的。如果它不是**一個「靜態」變量,那麼每個「實例」可以有自己的值分配給它。 – w00

相關問題