2015-09-25 82 views
2

加載XML結構考慮文件「cars.xml」複雜元素:如何記錄與PHPDoc的

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <car> 
     <model>Volvo</model> 
     <color>red</color> 
    </car> 
    <car> 
     <model>BMW</model> 
     <color>black</color> 
    </car> 
</root> 

一旦PHP加載我怎麼通過文件的PHPDoc的XML $變量的結構,尤其如此它可以用於IntelliJ-IDEA中的代碼完成?

/** 
* @var ?????????? $xml 
*/ 
$xml=simplexml_load_file('cars.xml'); 

回答

0

不要:)它更可能是您的XML是一個或多個對象的序列化。

因此,在您的軟件中,您不會傳遞XML對象,但只有在序列化或反序列化對象時才使用它。

然後你傳遞可能是具體類型的對象。

所以讓我們把你的問題從頭到尾。當你想要一個具體的類型時,爲什麼要關心XML。假設你想擁有一輛或多輛汽車,那麼讓我們來創建它們!

/** 
* Class Car 
*/ 
class Car 
{ 
    private $model; 
    private $color; 

    /** 
    * Car constructor. 
    * 
    * @param $model 
    * @param $color 
    */ 
    public function __construct($model, $color) 
    { 
     $this->model = $model; 
     $this->color = $color; 
    } 

    /** 
    * @return mixed 
    */ 
    public function getColor() 
    { 
     return $this->color; 
    } 

    /** 
    * @return mixed 
    */ 
    public function getModel() 
    { 
     return $this->model; 
    } 
} 

現在很簡單。而正確的,這裏有雲:

$car = new Car('Sahara', 'Blue'); 

的IntelliJ-IDEA已經將正確的類型提示的$car變量。

但是等等,你不是問XML嗎?那麼,真的是這樣。好的,我們再來一次。當我們需要它們時,讓我們假裝事物已經存在。例如打開XML轉換的汽車秒的數組:

$buffer = <<<XML 
<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <car> 
     <model>Volvo</model> 
     <color>red</color> 
    </car> 
    <car> 
     <model>BMW</model> 
     <color>black</color> 
    </car> 
</root> 
XML; 

$xml = new SimpleXMLElement($buffer); 

$carsArray = new CarsArray(); 

$cars = $carsArray->fromXml($xml); 

現在又是容易的。當然,問題仍然是什麼現在CarsArray?好吧,讓我們說這是某種概念的SimpleXMLElement翻譯成汽車秒的陣列,反之亦然:

/** 
* Class CarsArray 
*/ 
class CarsArray 
{ 
    /** 
    * @param array $cars 
    * 
    * @return SimpleXMLElement 
    */ 
    public function toXml(array $cars) 
    { 
     $xml = new SimpleXMLElement('<root/>'); 
     foreach ($cars as $car) { 
      if ($car instanceof Car) { 
       $node = $xml->addChild('car'); 
       $node->addChild('color', $car->getColor()); 
       $node->addChild('model', $car->getModel()); 
      } 
     } 

     return $xml; 
    } 

    /** 
    * @param SimpleXMLElement $xml 
    * 
    * @return array|Car[] 
    */ 
    public function fromXml(SimpleXMLElement $xml) 
    { 
     $array = []; 
     foreach ($xml->car as $car) { 
      $array[] = new Car($car->model, $car->color); 
     } 

     return $array; 
    } 
} 

正如你所看到的,這是沒有什麼很花哨。並且已經是一個工作示例。這裏是它的最後一部分:

foreach ($cars as $car) { 
    echo "- ", $car->getModel(), "\n"; 
} 

做以下的輸出:

- Volvo 
- BMW 

要從VARTYPE這裏暗示的利潤,這是你暗示與數組返回值的類型是很重要的。讓我們再看看進入fromXml()方法:

/** 
    * @param SimpleXMLElement $xml 
    * 
    * @return array|Car[] 
    */ 
    public function fromXml(SimpleXMLElement $xml) 
    { 
     $array = []; 
     ... 

正如你可以看到@return array|Car[]告訴返回值是一個陣列也(因此管道「|」)的陣列汽車 S的,由它後面的方括號對錶示(代表陣列)。

 * @return array|Car[] 

這會再次給你代碼補全。不僅如此,在大部分應用程序中,您都知道如何處理對象,並且這些對象獨立於XML,並且XML和汽車之間的關係只針對您的程序中需要翻譯/兩者之間的轉換/映射。

我希望這會有所幫助。

您可以在這裏找到代碼以及在線交互示例:https://eval.in/439670