如何用phpDOC文档加载xml结构


How to document loaded xml structure with phpDOC

考虑包含复杂元素的'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