考虑包含复杂元素的'cars.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>
一旦加载到PHP中,我如何通过phpDoc记录$xml变量的结构,特别是这样它可以在IntelliJ-IDEA中使用代码完成?
/**
* @var ?????????? $xml
*/
$xml=simplexml_load_file('cars.xml');
不要:)您的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转换为数组s:
$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转换为Cars数组,反之亦然:
/**
* 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
要从这里的可变类型提示中获益,使用返回值的数组提示类型是很重要的。让我们再看一下fromXml()
方法:
/**
* @param SimpleXMLElement $xml
*
* @return array|Car[]
*/
public function fromXml(SimpleXMLElement $xml)
{
$array = [];
...
如你所见,@return array|Car[]
告诉返回值是一个数组和一个Cars的数组(因此管道"|"),由它后面的方括号对表示(代表数组)。
* @return array|Car[]
这将再次为您提供代码补全。不仅如此,在你的大部分应用程序中,你知道如何处理Car对象,这是独立于XML的,XML和汽车之间的关系只对你的程序中需要在两者之间转换/转换/映射的那部分感兴趣。
我希望这对你有帮助。
您可以在这里找到代码以及交互式在线示例:https://eval.in/439670