Issues (39)

src/XML/SerializableElementTrait.php (1 issue)

Labels
Severity
1
<?php
2
3
declare(strict_types=1);
4
5
namespace SimpleSAML\XML;
6
7
use DOMElement;
8
use SimpleSAML\XML\DOMDocumentFactory;
9
10
use function array_pop;
11
use function get_object_vars;
12
13
/**
14
 * Trait grouping common functionality for elements implementing the SerializableElement element.
15
 *
16
 * @package simplesamlphp/xml-common
17
 */
18
trait SerializableElementTrait
19
{
20
    /**
21
     * Whether to format the string output of this element or not.
22
     *
23
     * Defaults to true. Override to disable output formatting.
24
     *
25
     * @var bool
26
     */
27
    protected bool $formatOutput = true;
28
29
30
    /**
31
     * Output the class as an XML-formatted string
32
     *
33
     * @return string
34
     */
35
    public function __toString(): string
36
    {
37
        $xml = $this->toXML();
38
39
        $xmlString = $xml->ownerDocument->saveXML();
0 ignored issues
show
The method saveXML() does not exist on null. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

39
        /** @scrutinizer ignore-call */ 
40
        $xmlString = $xml->ownerDocument->saveXML();

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
40
41
        $doc = DOMDocumentFactory::fromString($xmlString);
42
        $doc->formatOutput = $this->formatOutput;
43
44
        if (static::getNormalization() === true) {
45
            $normalized = DOMDocumentFactory::normalizeDocument($doc);
46
            $normalized->normalizeDocument();
47
            return $normalized->saveXML($normalized->firstChild);
48
        }
49
50
        $doc->normalizeDocument();
51
        return $doc->saveXML($doc->firstChild);
52
    }
53
54
55
    /**
56
     * Serialize this XML chunk.
57
     *
58
     * This method will be invoked by any calls to serialize().
59
     *
60
     * @return array{0: string} The serialized representation of this XML object.
61
     */
62
    public function __serialize(): array
63
    {
64
        $xml = $this->toXML();
65
        return [$xml->ownerDocument->saveXML($xml)];
66
    }
67
68
69
    /**
70
     * Unserialize an XML object and load it..
71
     *
72
     * This method will be invoked by any calls to unserialize(), allowing us to restore any data that might not
73
     * be serializable in its original form (e.g.: DOM objects).
74
     *
75
     * @param array{0: string} $serialized The XML object that we want to restore.
76
     */
77
    public function __unserialize(array $serialized): void
78
    {
79
        $xml = static::fromXML(
80
            DOMDocumentFactory::fromString(array_pop($serialized))->documentElement,
81
        );
82
83
        $vars = get_object_vars($xml);
84
        foreach ($vars as $k => $v) {
85
            $this->$k = $v;
86
        }
87
    }
88
89
90
    /**
91
     * Create XML from this class
92
     *
93
     * @param \DOMElement|null $parent
94
     * @return \DOMElement
95
     */
96
    abstract public function toXML(?DOMElement $parent = null): DOMElement;
97
}
98