From 4687bd97f37ae2402f1197d4cb897f2da0338203 Mon Sep 17 00:00:00 2001 From: Grzegorz Korba Date: Mon, 6 Feb 2023 11:12:10 +0100 Subject: [PATCH 1/2] Fix properties for XML-related classes These properties are real (non-dynamic): https://github.com/php/php-src/blob/master/ext/xmlreader/php_xmlreader.stub.php https://www.php.net/manual/en/class.domnamednodemap.php Current usage of `@property-read` annotations makes PHPStan fail on PHP 8.2. --- dom/dom_c.php | 8 ++- xmlreader/xmlreader.php | 113 ++++++++++++++++++++++++++++++++++------ 2 files changed, 105 insertions(+), 16 deletions(-) diff --git a/dom/dom_c.php b/dom/dom_c.php index 58e1a23be..a705570a4 100644 --- a/dom/dom_c.php +++ b/dom/dom_c.php @@ -1302,10 +1302,16 @@ public function getIterator(): Iterator {} /** * The DOMNamedNodeMap class * @link https://php.net/manual/en/class.domnamednodemap.php - * @property-read int $length The number of nodes in the map. The range of valid child node indices is 0 to length - 1 inclusive. */ class DOMNamedNodeMap implements IteratorAggregate, Countable { + /** + * The number of nodes in the map. The range of valid child node indices is 0 to length - 1 inclusive. + * @var int + * @readonly + */ + public $length; + /** * Retrieves a node specified by name * @link https://php.net/manual/en/domnamednodemap.getnameditem.php diff --git a/xmlreader/xmlreader.php b/xmlreader/xmlreader.php index d895cab07..45bd82440 100644 --- a/xmlreader/xmlreader.php +++ b/xmlreader/xmlreader.php @@ -10,21 +10,6 @@ * cursor going forward on the document stream and stopping at each node * on the way. * @link https://php.net/manual/en/class.xmlreader.php - * - * @property-read int $attributeCount The number of attributes on the node - * @property-read string $baseURI The base URI of the node - * @property-read int $depth Depth of the node in the tree, starting at 0 - * @property-read bool $hasAttributes Indicates if node has attributes - * @property-read bool $hasValue Indicates if node has a text value - * @property-read bool $isDefault Indicates if attribute is defaulted from DTD - * @property-read bool $isEmptyElement Indicates if node is an empty element tag - * @property-read string $localName The local name of the node - * @property-read string $name The qualified name of the node - * @property-read string $namespaceURI The URI of the namespace associated with the node - * @property-read int $nodeType The node type for the node - * @property-read string $prefix The prefix of the namespace associated with the node - * @property-read string $value The text value of the node - * @property-read string $xmlLang The xml:lang scope which the node resides */ class XMLReader { @@ -138,6 +123,104 @@ class XMLReader */ public const SUBST_ENTITIES = 4; + /** + * The number of attributes on the node + * @var int + * @readonly + */ + public $attributeCount; + + /** + * The base URI of the node + * @var string + * @readonly + */ + public $baseURI; + + /** + * Depth of the node in the tree, starting at 0 + * @var int + * @readonly + */ + public $depth; + + /** + * Indicates if node has attributes + * @var bool + * @readonly + */ + public $hasAttributes; + + /** + * Indicates if node has a text value + * @var bool + * @readonly + */ + public $hasValue; + + /** + * Indicates if attribute is defaulted from DTD + * @var bool + * @readonly + */ + public $isDefault; + + /** + * Indicates if node is an empty element tag + * @var bool + * @readonly + */ + public $isEmptyElement; + + /** + * The local name of the node + * @var string + * @readonly + */ + public $localName; + + /** + * The qualified name of the node + * @var string + * @readonly + */ + public $name; + + /** + * The URI of the namespace associated with the node + * @var string + * @readonly + */ + public $namespaceURI; + + /** + * The node type for the node + * @var int + * @readonly + */ + public $nodeType; + + /** + * The prefix of the namespace associated with the node + * @var string + * @readonly + */ + public $prefix; + + /** + * The text value of the node + * @var string + * @readonly + */ + public $value; + + /** + * The xml:lang scope which the node resides + * @var string + * @readonly + */ + public $xmlLang; + /** * Close the XMLReader input * @link https://php.net/manual/en/xmlreader.close.php From 08046ea1db3d44cafc44300f4980b0b7fba9a4de Mon Sep 17 00:00:00 2001 From: Grzegorz Korba Date: Tue, 7 Feb 2023 09:23:49 +0100 Subject: [PATCH 2/2] Separate class definitions for PHP >=8.1 and <8.1 See: https://github.com/JetBrains/phpstorm-stubs/pull/1526#issuecomment-1419394807 --- dom/dom_c.php | 98 +--- dom/dom_domnamednodemap_81.php | 120 +++++ dom/dom_domnamednodemap_pre81.php | 116 +++++ xmlreader/{xmlreader.php => xmlreader_81.php} | 3 + xmlreader/xmlreader_pre81.php | 461 ++++++++++++++++++ 5 files changed, 701 insertions(+), 97 deletions(-) create mode 100644 dom/dom_domnamednodemap_81.php create mode 100644 dom/dom_domnamednodemap_pre81.php rename xmlreader/{xmlreader.php => xmlreader_81.php} (99%) create mode 100644 xmlreader/xmlreader_pre81.php diff --git a/dom/dom_c.php b/dom/dom_c.php index a705570a4..5f9009837 100644 --- a/dom/dom_c.php +++ b/dom/dom_c.php @@ -1299,102 +1299,6 @@ public function count(): int {} public function getIterator(): Iterator {} } -/** - * The DOMNamedNodeMap class - * @link https://php.net/manual/en/class.domnamednodemap.php - */ -class DOMNamedNodeMap implements IteratorAggregate, Countable -{ - /** - * The number of nodes in the map. The range of valid child node indices is 0 to length - 1 inclusive. - * @var int - * @readonly - */ - public $length; - - /** - * Retrieves a node specified by name - * @link https://php.net/manual/en/domnamednodemap.getnameditem.php - * @param string $qualifiedName

- * The nodeName of the node to retrieve. - *

- * @return DOMNode|null A node (of any type) with the specified nodeName, or - * null if no node is found. - */ - #[TentativeType] - public function getNamedItem(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $qualifiedName): ?DOMNode {} - - /** - * @param DOMNode $arg - */ - public function setNamedItem(DOMNode $arg) {} - - /** - * @param $name [optional] - */ - public function removeNamedItem($name) {} - - /** - * Retrieves a node specified by index - * @link https://php.net/manual/en/domnamednodemap.item.php - * @param int $index

- * Index into this map. - *

- * @return DOMNode|null The node at the indexth position in the map, or null - * if that is not a valid index (greater than or equal to the number of nodes - * in this map). - */ - #[TentativeType] - public function item( - #[PhpStormStubsElementAvailable(from: '5.3', to: '7.0')] $index = 0, - #[PhpStormStubsElementAvailable(from: '7.1')] #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $index - ): ?DOMNode {} - - /** - * Retrieves a node specified by local name and namespace URI - * @link https://php.net/manual/en/domnamednodemap.getnameditemns.php - * @param string $namespace

- * The namespace URI of the node to retrieve. - *

- * @param string $localName

- * The local name of the node to retrieve. - *

- * @return DOMNode|null A node (of any type) with the specified local name and namespace URI, or - * null if no node is found. - */ - #[TentativeType] - public function getNamedItemNS( - #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $namespaceURI = '', - #[PhpStormStubsElementAvailable(from: '8.0')] ?string $namespace, - #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $localName = '', - #[PhpStormStubsElementAvailable(from: '8.0')] string $localName - ): ?DOMNode {} - - /** - * @param DOMNode $arg [optional] - */ - public function setNamedItemNS(DOMNode $arg) {} - - /** - * @param $namespace [optional] - * @param $localName [optional] - */ - public function removeNamedItemNS($namespace, $localName) {} - - /** - * @return int<0,max> - * @since 7.2 - */ - #[TentativeType] - public function count(): int {} - - /** - * @return Iterator - * @since 8.0 - */ - public function getIterator(): Iterator {} -} - /** * The DOMCharacterData class represents nodes with character data. * No nodes directly correspond to this class, but other nodes do inherit from it. @@ -2163,7 +2067,7 @@ class DOMDocumentType extends DOMNode /** * @var DOMNamedNodeMap - * A DOMNamedNodeMap containing the notations declared in the DTD. + * A DOMNamedNodeMap containing the notations declared in the DTD. * @link https://php.net/manual/en/class.domdocumenttype.php#domdocumenttype.props.notations */ #[LanguageLevelTypeAware(['8.1' => 'DOMNamedNodeMap'], default: '')] diff --git a/dom/dom_domnamednodemap_81.php b/dom/dom_domnamednodemap_81.php new file mode 100644 index 000000000..f05559911 --- /dev/null +++ b/dom/dom_domnamednodemap_81.php @@ -0,0 +1,120 @@ + + * The nodeName of the node to retrieve. + *

+ * @return DOMNode|null A node (of any type) with the specified nodeName, or + * null if no node is found. + */ + #[TentativeType] + public function getNamedItem(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $qualifiedName): ?DOMNode + { + } + + /** + * @param DOMNode $arg + */ + public function setNamedItem(DOMNode $arg) + { + } + + /** + * @param $name [optional] + */ + public function removeNamedItem($name) + { + } + + /** + * Retrieves a node specified by index + * @link https://php.net/manual/en/domnamednodemap.item.php + * @param int $index

+ * Index into this map. + *

+ * @return DOMNode|null The node at the indexth position in the map, or null + * if that is not a valid index (greater than or equal to the number of nodes + * in this map). + */ + #[TentativeType] + public function item( + #[PhpStormStubsElementAvailable(from: '5.3', to: '7.0')] $index = 0, + #[PhpStormStubsElementAvailable(from: '7.1')] #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $index + ): ?DOMNode { + } + + /** + * Retrieves a node specified by local name and namespace URI + * @link https://php.net/manual/en/domnamednodemap.getnameditemns.php + * @param string $namespace

+ * The namespace URI of the node to retrieve. + *

+ * @param string $localName

+ * The local name of the node to retrieve. + *

+ * @return DOMNode|null A node (of any type) with the specified local name and namespace URI, or + * null if no node is found. + */ + #[TentativeType] + public function getNamedItemNS( + #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $namespaceURI = '', + #[PhpStormStubsElementAvailable(from: '8.0')] ?string $namespace, + #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $localName = '', + #[PhpStormStubsElementAvailable(from: '8.0')] string $localName + ): ?DOMNode { + } + + /** + * @param DOMNode $arg [optional] + */ + public function setNamedItemNS(DOMNode $arg) + { + } + + /** + * @param $namespace [optional] + * @param $localName [optional] + */ + public function removeNamedItemNS($namespace, $localName) + { + } + + /** + * @return int<0,max> + * @since 7.2 + */ + #[TentativeType] + public function count(): int + { + } + + /** + * @return Iterator + * @since 8.0 + */ + public function getIterator(): Iterator + { + } +} diff --git a/dom/dom_domnamednodemap_pre81.php b/dom/dom_domnamednodemap_pre81.php new file mode 100644 index 000000000..201ceeccd --- /dev/null +++ b/dom/dom_domnamednodemap_pre81.php @@ -0,0 +1,116 @@ + + * The nodeName of the node to retrieve. + *

+ * @return DOMNode|null A node (of any type) with the specified nodeName, or + * null if no node is found. + */ + #[TentativeType] + public function getNamedItem(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $qualifiedName): ?DOMNode + { + } + + /** + * @param DOMNode $arg + */ + public function setNamedItem(DOMNode $arg) + { + } + + /** + * @param $name [optional] + */ + public function removeNamedItem($name) + { + } + + /** + * Retrieves a node specified by index + * @link https://php.net/manual/en/domnamednodemap.item.php + * @param int $index

+ * Index into this map. + *

+ * @return DOMNode|null The node at the indexth position in the map, or null + * if that is not a valid index (greater than or equal to the number of nodes + * in this map). + */ + #[TentativeType] + public function item( + #[PhpStormStubsElementAvailable(from: '5.3', to: '7.0')] $index = 0, + #[PhpStormStubsElementAvailable(from: '7.1')] #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $index + ): ?DOMNode { + } + + /** + * Retrieves a node specified by local name and namespace URI + * @link https://php.net/manual/en/domnamednodemap.getnameditemns.php + * @param string $namespace

+ * The namespace URI of the node to retrieve. + *

+ * @param string $localName

+ * The local name of the node to retrieve. + *

+ * @return DOMNode|null A node (of any type) with the specified local name and namespace URI, or + * null if no node is found. + */ + #[TentativeType] + public function getNamedItemNS( + #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $namespaceURI = '', + #[PhpStormStubsElementAvailable(from: '8.0')] ?string $namespace, + #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $localName = '', + #[PhpStormStubsElementAvailable(from: '8.0')] string $localName + ): ?DOMNode { + } + + /** + * @param DOMNode $arg [optional] + */ + public function setNamedItemNS(DOMNode $arg) + { + } + + /** + * @param $namespace [optional] + * @param $localName [optional] + */ + public function removeNamedItemNS($namespace, $localName) + { + } + + /** + * @return int<0,max> + * @since 7.2 + */ + #[TentativeType] + public function count(): int + { + } + + /** + * @return Iterator + * @since 8.0 + */ + public function getIterator(): Iterator + { + } +} diff --git a/xmlreader/xmlreader.php b/xmlreader/xmlreader_81.php similarity index 99% rename from xmlreader/xmlreader.php rename to xmlreader/xmlreader_81.php index 45bd82440..30e220de9 100644 --- a/xmlreader/xmlreader.php +++ b/xmlreader/xmlreader_81.php @@ -10,6 +10,9 @@ * cursor going forward on the document stream and stopping at each node * on the way. * @link https://php.net/manual/en/class.xmlreader.php + * @see https://github.com/JetBrains/phpstorm-stubs/pull/1526#issuecomment-1419394807 + * + * @since 8.1 */ class XMLReader { diff --git a/xmlreader/xmlreader_pre81.php b/xmlreader/xmlreader_pre81.php new file mode 100644 index 000000000..7e0fd9c68 --- /dev/null +++ b/xmlreader/xmlreader_pre81.php @@ -0,0 +1,461 @@ +TRUE on success or FALSE on failure. + * @since 5.1.2 + */ + public function close() {} + + /** + * Get the value of a named attribute + * @link https://php.net/manual/en/xmlreader.getattribute.php + * @param string $name

+ * The name of the attribute. + *

+ * @return string|null The value of the attribute, or NULL if no attribute with the given + * name is found or not positioned on an element node. + * @since 5.1.2 + */ + #[TentativeType] + public function getAttribute(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $name): ?string {} + + /** + * Get the value of an attribute by index + * @link https://php.net/manual/en/xmlreader.getattributeno.php + * @param int $index

+ * The position of the attribute. + *

+ * @return string|null The value of the attribute, or NULL if no attribute exists + * at index or not positioned of element. + * @since 5.1.2 + */ + #[TentativeType] + public function getAttributeNo(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $index): ?string {} + + /** + * Get the value of an attribute by localname and URI + * @link https://php.net/manual/en/xmlreader.getattributens.php + * @param string $name

+ * The local name. + *

+ * @param string $namespace

+ * The namespace URI. + *

+ * @return string|null The value of the attribute, or NULL if no attribute with the + * given localName and + * namespaceURI is found or not positioned of element. + * @since 5.1.2 + */ + #[TentativeType] + public function getAttributeNs( + #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $name, + #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $namespace + ): ?string {} + + /** + * Indicates if specified property has been set + * @link https://php.net/manual/en/xmlreader.getparserproperty.php + * @param int $property

+ * One of the parser option + * constants. + *

+ * @return bool TRUE on success or FALSE on failure. + * @since 5.1.2 + */ + #[TentativeType] + public function getParserProperty(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $property): bool {} + + /** + * Indicates if the parsed document is valid + * @link https://php.net/manual/en/xmlreader.isvalid.php + * @return bool TRUE on success or FALSE on failure. + * @since 5.1.2 + */ + #[TentativeType] + public function isValid(): bool {} + + /** + * Lookup namespace for a prefix + * @link https://php.net/manual/en/xmlreader.lookupnamespace.php + * @param string $prefix

+ * String containing the prefix. + *

+ * @return string|null TRUE on success or FALSE on failure. + * @since 5.1.2 + */ + #[TentativeType] + public function lookupNamespace(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $prefix): ?string {} + + /** + * Move cursor to an attribute by index + * @link https://php.net/manual/en/xmlreader.movetoattributeno.php + * @param int $index

+ * The position of the attribute. + *

+ * @return bool TRUE on success or FALSE on failure. + * @since 5.1.2 + */ + #[TentativeType] + public function moveToAttributeNo(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $index): bool {} + + /** + * Move cursor to a named attribute + * @link https://php.net/manual/en/xmlreader.movetoattribute.php + * @param string $name

+ * The name of the attribute. + *

+ * @return bool TRUE on success or FALSE on failure. + * @since 5.1.2 + */ + #[TentativeType] + public function moveToAttribute(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $name): bool {} + + /** + * Move cursor to a named attribute + * @link https://php.net/manual/en/xmlreader.movetoattributens.php + * @param string $name

+ * The local name. + *

+ * @param string $namespace

+ * The namespace URI. + *

+ * @return bool TRUE on success or FALSE on failure. + * @since 5.1.2 + */ + #[TentativeType] + public function moveToAttributeNs( + #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $name, + #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $namespace + ): bool {} + + /** + * Position cursor on the parent Element of current Attribute + * @link https://php.net/manual/en/xmlreader.movetoelement.php + * @return bool TRUE if successful and FALSE if it fails or not positioned on + * Attribute when this method is called. + * @since 5.1.2 + */ + #[TentativeType] + public function moveToElement(): bool {} + + /** + * Position cursor on the first Attribute + * @link https://php.net/manual/en/xmlreader.movetofirstattribute.php + * @return bool TRUE on success or FALSE on failure. + * @since 5.1.2 + */ + #[TentativeType] + public function moveToFirstAttribute(): bool {} + + /** + * Position cursor on the next Attribute + * @link https://php.net/manual/en/xmlreader.movetonextattribute.php + * @return bool TRUE on success or FALSE on failure. + * @since 5.1.2 + */ + #[TentativeType] + public function moveToNextAttribute(): bool {} + + /** + * Set the URI containing the XML to parse + * @link https://php.net/manual/en/xmlreader.open.php + * @param string $uri

+ * URI pointing to the document. + *

+ * @param string $encoding [optional]

+ * The document encoding or NULL. + *

+ * @param int $flags [optional]

+ * A bitmask of the LIBXML_* + * constants. + *

+ * @return XMLReader|bool TRUE on success or FALSE on failure. If called statically, returns an + * XMLReader or FALSE on failure. + * @since 5.1.2 + */ + public static function open( + #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $uri, + #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $encoding = null, + #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags = 0 + ) {} + + /** + * Move to next node in document + * @link https://php.net/manual/en/xmlreader.read.php + * @return bool TRUE on success or FALSE on failure. + * @since 5.1.2 + */ + #[TentativeType] + public function read(): bool {} + + /** + * Move cursor to next node skipping all subtrees + * @link https://php.net/manual/en/xmlreader.next.php + * @param string $name [optional]

+ * The name of the next node to move to. + *

+ * @return bool TRUE on success or FALSE on failure. + * @since 5.1.2 + */ + #[TentativeType] + public function next(#[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $name = null): bool {} + + /** + * Retrieve XML from current node + * @link https://php.net/manual/en/xmlreader.readinnerxml.php + * @return string the contents of the current node as a string. Empty string on failure. + */ + #[TentativeType] + public function readInnerXml(): string {} + + /** + * Retrieve XML from current node, including it self + * @link https://php.net/manual/en/xmlreader.readouterxml.php + * @return string the contents of current node, including itself, as a string. Empty string on failure. + */ + #[TentativeType] + public function readOuterXml(): string {} + + /** + * Reads the contents of the current node as a string + * @link https://php.net/manual/en/xmlreader.readstring.php + * @return string the content of the current node as a string. Empty string on + * failure. + */ + #[TentativeType] + public function readString(): string {} + + /** + * Validate document against XSD + * @link https://php.net/manual/en/xmlreader.setschema.php + * @param string $filename

+ * The filename of the XSD schema. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + #[TentativeType] + public function setSchema(#[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $filename): bool {} + + /** + * Set parser options + * @link https://php.net/manual/en/xmlreader.setparserproperty.php + * @param int $property

+ * One of the parser option + * constants. + *

+ * @param bool $value

+ * If set to TRUE the option will be enabled otherwise will + * be disabled. + *

+ * @return bool TRUE on success or FALSE on failure. + * @since 5.1.2 + */ + #[TentativeType] + public function setParserProperty( + #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $property, + #[LanguageLevelTypeAware(['8.0' => 'bool'], default: '')] $value + ): bool {} + + /** + * Set the filename or URI for a RelaxNG Schema + * @link https://php.net/manual/en/xmlreader.setrelaxngschema.php + * @param string $filename

+ * filename or URI pointing to a RelaxNG Schema. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + #[TentativeType] + public function setRelaxNGSchema(#[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $filename): bool {} + + /** + * Set the data containing a RelaxNG Schema + * @link https://php.net/manual/en/xmlreader.setrelaxngschemasource.php + * @param string $source

+ * String containing the RelaxNG Schema. + *

+ * @return bool TRUE on success or FALSE on failure. + * @since 5.1.2 + */ + #[TentativeType] + public function setRelaxNGSchemaSource(#[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $source): bool {} + + /** + * Set the data containing the XML to parse + * @link https://php.net/manual/en/xmlreader.xml.php + * @param string $source

+ * String containing the XML to be parsed. + *

+ * @param string $encoding [optional]

+ * The document encoding or NULL. + *

+ * @param int $flags [optional]

+ * A bitmask of the LIBXML_* + * constants. + *

+ * @return XMLReader|bool TRUE on success or FALSE on failure. If called statically, returns an + * XMLReader or FALSE on failure. + * @since 5.1.2 + */ + public static function XML( + #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $source, + #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $encoding = null, + #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags = 0 + ) {} + + /** + * Returns a copy of the current node as a DOM object + * @link https://php.net/manual/en/xmlreader.expand.php + * @param null|DOMNode $baseNode [optional] + * @return DOMNode|false The resulting DOMNode or FALSE on error. + * @since 5.1.2 + */ + #[TentativeType] + public function expand( + #[PhpStormStubsElementAvailable(from: '7.0')] #[LanguageLevelTypeAware(['8.0' => 'DOMNode|null'], default: '')] $baseNode = null + ): DOMNode|false {} +} +// End of xmlreader v.0.2