@@ -31,7 +31,7 @@ class DOMNode
3131{
3232 /**
3333 * @readonly
34- * @var DOMNamedNodeMap<DOMAttr>|null
34+ * @var DOMNamedNodeMap<DOMAttr<string> >|null
3535 */
3636 public $attributes;
3737
@@ -45,6 +45,13 @@ class DOMElement extends DOMNode
4545 /** @var DOMDocument */
4646 public $ownerDocument;
4747
48+ /**
49+ * @readonly
50+ * @inherited
51+ * @var DOMNamedNodeMap<DOMAttr<string>>|null
52+ */
53+ public $attributes;
54+
4855 /**
4956 * @param string $name
5057 * @return DOMNodeList<DOMElement>
@@ -59,12 +66,22 @@ class DOMElement extends DOMNode
5966 public function getElementsByTagNameNS ($namespaceURI, $localName) {}
6067
6168 /**
62- * @phpstan-assert-if-true DOMNameSpaceNode|DOMAttr $this->hasAttribute($qualifiedName)
63- * @phpstan-assert-if-true DOMNamedNodeMap<DOMAttr> $this->attributes
69+ * @template T of string
70+ * @param T $qualifiedName
71+ * @return bool
72+ * @phpstan-assert-if-true (T is 'xml:id' ? DOMNameSpaceNode : DOMAttr<T>) $this->hasAttribute($qualifiedName)
73+ * @phpstan-assert-if-true DOMNameSpaceNode<DOMAttr<T>|DOMAttr<string>> $this->$attributes
6474 */
6575 public function hasAttribute(string $qualifiedName): bool
6676
67- public function getAttributeNode(string $qualifiedName): DOMAttr|DOMNameSpaceNode|false
77+ public function hasAttributeNS(?string $namespace, string $localName): bool
78+
79+ /**
80+ * @template T of string
81+ * @param T $qualifiedName
82+ * @return (T is 'xml:id' ? DOMNameSpaceNode|false : DOMAttr|false)
83+ */
84+ public function getAttributeNode(string $qualifiedName): DOMAttr<T>|DOMNameSpaceNode|false
6885}
6986
7087/**
@@ -96,11 +113,20 @@ class DOMXPath
96113
97114}
98115
116+ /**
117+ * @template Name as string
118+ */
99119class DOMAttr extends DOMNode
100120{
101121 /** @var DOMDocument */
102122 public $ownerDocument;
103123
124+ /**
125+ * @var Name
126+ * @readonly
127+ */
128+ public $name;
129+
104130}
105131
106132class DOMCharacterData extends DOMNode
0 commit comments