diff --git a/composer.json b/composer.json
index 6b487a42c095f2a38ba334b7cb4e1d5e8ffa7afb..974e19d98212cb205979e750d90d74521ba242ef 100644
--- a/composer.json
+++ b/composer.json
@@ -27,14 +27,14 @@
     "extra": {
     },
     "require": {
-        "php": "~8.1.0 || ~8.2.0"
+        "php": "~8.1.0 || ~8.2.0 || ~8.3.0"
     },
     "require-dev": {
         "laminas/laminas-coding-standard": "^2.5",
-        "phpbench/phpbench": "^1.2.9",
-        "phpunit/phpunit": "^10.0.16",
+        "phpbench/phpbench": "^1.2.14",
+        "phpunit/phpunit": "^10.3.3",
         "psalm/plugin-phpunit": "^0.18.4",
-        "vimeo/psalm": "^5.8"
+        "vimeo/psalm": "^5.15.0"
     },
     "autoload": {
         "psr-4": {
diff --git a/composer.lock b/composer.lock
index ca794fc65f6b686f81a405ee7f2afcd51975e1cf..a8b5ec4455ae17d3fc431f0a1114df0e0be8275a 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "bd4486def28039b677cccb423202f417",
+    "content-hash": "8e628fbb1d53887883bae250fe3b4691",
     "packages": [],
     "packages-dev": [
         {
@@ -319,16 +319,16 @@
         },
         {
             "name": "composer/semver",
-            "version": "3.3.2",
+            "version": "3.4.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/composer/semver.git",
-                "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9"
+                "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9",
-                "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9",
+                "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32",
+                "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32",
                 "shasum": ""
             },
             "require": {
@@ -378,9 +378,9 @@
                 "versioning"
             ],
             "support": {
-                "irc": "irc://irc.freenode.org/composer",
+                "irc": "ircs://irc.libera.chat:6697/composer",
                 "issues": "https://github.com/composer/semver/issues",
-                "source": "https://github.com/composer/semver/tree/3.3.2"
+                "source": "https://github.com/composer/semver/tree/3.4.0"
             },
             "funding": [
                 {
@@ -396,7 +396,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-04-01T19:23:25+00:00"
+            "time": "2023-08-31T09:50:34+00:00"
         },
         {
             "name": "composer/xdebug-handler",
@@ -1008,16 +1008,16 @@
         },
         {
             "name": "netresearch/jsonmapper",
-            "version": "v4.1.0",
+            "version": "v4.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/cweiske/jsonmapper.git",
-                "reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f"
+                "reference": "f60565f8c0566a31acf06884cdaa591867ecc956"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/cfa81ea1d35294d64adb9c68aa4cb9e92400e53f",
-                "reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f",
+                "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/f60565f8c0566a31acf06884cdaa591867ecc956",
+                "reference": "f60565f8c0566a31acf06884cdaa591867ecc956",
                 "shasum": ""
             },
             "require": {
@@ -1053,22 +1053,22 @@
             "support": {
                 "email": "cweiske@cweiske.de",
                 "issues": "https://github.com/cweiske/jsonmapper/issues",
-                "source": "https://github.com/cweiske/jsonmapper/tree/v4.1.0"
+                "source": "https://github.com/cweiske/jsonmapper/tree/v4.2.0"
             },
-            "time": "2022-12-08T20:46:14+00:00"
+            "time": "2023-04-09T17:37:40+00:00"
         },
         {
             "name": "nikic/php-parser",
-            "version": "v4.15.4",
+            "version": "v4.17.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/nikic/PHP-Parser.git",
-                "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290"
+                "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290",
-                "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290",
+                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d",
+                "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d",
                 "shasum": ""
             },
             "require": {
@@ -1109,9 +1109,9 @@
             ],
             "support": {
                 "issues": "https://github.com/nikic/PHP-Parser/issues",
-                "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4"
+                "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1"
             },
-            "time": "2023-03-05T19:49:14+00:00"
+            "time": "2023-08-13T19:53:39+00:00"
         },
         {
             "name": "phar-io/manifest",
@@ -1328,16 +1328,16 @@
         },
         {
             "name": "phpbench/phpbench",
-            "version": "1.2.9",
+            "version": "1.2.14",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpbench/phpbench.git",
-                "reference": "7aaea137809603b1c4f46d1790ba0f009be15797"
+                "reference": "edbd1b7ecf704eb01f7a2bcd1b8aa8c189f9fa4e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpbench/phpbench/zipball/7aaea137809603b1c4f46d1790ba0f009be15797",
-                "reference": "7aaea137809603b1c4f46d1790ba0f009be15797",
+                "url": "https://api.github.com/repos/phpbench/phpbench/zipball/edbd1b7ecf704eb01f7a2bcd1b8aa8c189f9fa4e",
+                "reference": "edbd1b7ecf704eb01f7a2bcd1b8aa8c189f9fa4e",
                 "shasum": ""
             },
             "require": {
@@ -1406,7 +1406,7 @@
             "description": "PHP Benchmarking Framework",
             "support": {
                 "issues": "https://github.com/phpbench/phpbench/issues",
-                "source": "https://github.com/phpbench/phpbench/tree/1.2.9"
+                "source": "https://github.com/phpbench/phpbench/tree/1.2.14"
             },
             "funding": [
                 {
@@ -1414,7 +1414,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2023-03-08T08:56:01+00:00"
+            "time": "2023-07-09T09:16:08+00:00"
         },
         {
             "name": "phpdocumentor/reflection-common",
@@ -1627,16 +1627,16 @@
         },
         {
             "name": "phpunit/php-code-coverage",
-            "version": "10.0.2",
+            "version": "10.1.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
-                "reference": "20800e84296ea4732f9a125e08ce86b4004ae3e4"
+                "reference": "1df504e42a88044c27a90136910f0b3fe9e91939"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/20800e84296ea4732f9a125e08ce86b4004ae3e4",
-                "reference": "20800e84296ea4732f9a125e08ce86b4004ae3e4",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/1df504e42a88044c27a90136910f0b3fe9e91939",
+                "reference": "1df504e42a88044c27a90136910f0b3fe9e91939",
                 "shasum": ""
             },
             "require": {
@@ -1655,7 +1655,7 @@
                 "theseer/tokenizer": "^1.2.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "^10.0"
+                "phpunit/phpunit": "^10.1"
             },
             "suggest": {
                 "ext-pcov": "PHP extension that provides line coverage",
@@ -1664,7 +1664,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "10.0-dev"
+                    "dev-main": "10.1-dev"
                 }
             },
             "autoload": {
@@ -1692,7 +1692,8 @@
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
-                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.0.2"
+                "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
+                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.5"
             },
             "funding": [
                 {
@@ -1700,20 +1701,20 @@
                     "type": "github"
                 }
             ],
-            "time": "2023-03-06T13:00:19+00:00"
+            "time": "2023-09-12T14:37:22+00:00"
         },
         {
             "name": "phpunit/php-file-iterator",
-            "version": "4.0.1",
+            "version": "4.1.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
-                "reference": "fd9329ab3368f59fe1fe808a189c51086bd4b6bd"
+                "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/fd9329ab3368f59fe1fe808a189c51086bd4b6bd",
-                "reference": "fd9329ab3368f59fe1fe808a189c51086bd4b6bd",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c",
+                "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c",
                 "shasum": ""
             },
             "require": {
@@ -1752,7 +1753,8 @@
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
-                "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.0.1"
+                "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy",
+                "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0"
             },
             "funding": [
                 {
@@ -1760,7 +1762,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2023-02-10T16:53:14+00:00"
+            "time": "2023-08-31T06:24:48+00:00"
         },
         {
             "name": "phpunit/php-invoker",
@@ -1827,16 +1829,16 @@
         },
         {
             "name": "phpunit/php-text-template",
-            "version": "3.0.0",
+            "version": "3.0.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-text-template.git",
-                "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d"
+                "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/9f3d3709577a527025f55bcf0f7ab8052c8bb37d",
-                "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748",
+                "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748",
                 "shasum": ""
             },
             "require": {
@@ -1874,7 +1876,8 @@
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
-                "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.0"
+                "security": "https://github.com/sebastianbergmann/php-text-template/security/policy",
+                "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1"
             },
             "funding": [
                 {
@@ -1882,7 +1885,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2023-02-03T06:56:46+00:00"
+            "time": "2023-08-31T14:07:24+00:00"
         },
         {
             "name": "phpunit/php-timer",
@@ -1945,16 +1948,16 @@
         },
         {
             "name": "phpunit/phpunit",
-            "version": "10.0.16",
+            "version": "10.3.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
-                "reference": "07d386a11ac7094032900f07cada1c8975d16607"
+                "reference": "b8d59476f19115c9774b3b447f78131781c6c32b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/07d386a11ac7094032900f07cada1c8975d16607",
-                "reference": "07d386a11ac7094032900f07cada1c8975d16607",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b8d59476f19115c9774b3b447f78131781c6c32b",
+                "reference": "b8d59476f19115c9774b3b447f78131781c6c32b",
                 "shasum": ""
             },
             "require": {
@@ -1968,7 +1971,7 @@
                 "phar-io/manifest": "^2.0.3",
                 "phar-io/version": "^3.0.2",
                 "php": ">=8.1",
-                "phpunit/php-code-coverage": "^10.0",
+                "phpunit/php-code-coverage": "^10.1.5",
                 "phpunit/php-file-iterator": "^4.0",
                 "phpunit/php-invoker": "^4.0",
                 "phpunit/php-text-template": "^3.0",
@@ -1979,7 +1982,7 @@
                 "sebastian/diff": "^5.0",
                 "sebastian/environment": "^6.0",
                 "sebastian/exporter": "^5.0",
-                "sebastian/global-state": "^6.0",
+                "sebastian/global-state": "^6.0.1",
                 "sebastian/object-enumerator": "^5.0",
                 "sebastian/recursion-context": "^5.0",
                 "sebastian/type": "^4.0",
@@ -1994,7 +1997,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "10.0-dev"
+                    "dev-main": "10.3-dev"
                 }
             },
             "autoload": {
@@ -2025,7 +2028,8 @@
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/phpunit/issues",
-                "source": "https://github.com/sebastianbergmann/phpunit/tree/10.0.16"
+                "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
+                "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.4"
             },
             "funding": [
                 {
@@ -2041,7 +2045,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2023-03-13T09:02:40+00:00"
+            "time": "2023-09-12T14:42:28+00:00"
         },
         {
             "name": "psalm/plugin-phpunit",
@@ -2424,16 +2428,16 @@
         },
         {
             "name": "sebastian/comparator",
-            "version": "5.0.0",
+            "version": "5.0.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/comparator.git",
-                "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c"
+                "reference": "2db5010a484d53ebf536087a70b4a5423c102372"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/72f01e6586e0caf6af81297897bd112eb7e9627c",
-                "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c",
+                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372",
+                "reference": "2db5010a484d53ebf536087a70b4a5423c102372",
                 "shasum": ""
             },
             "require": {
@@ -2444,7 +2448,7 @@
                 "sebastian/exporter": "^5.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "^10.0"
+                "phpunit/phpunit": "^10.3"
             },
             "type": "library",
             "extra": {
@@ -2488,7 +2492,8 @@
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/comparator/issues",
-                "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.0"
+                "security": "https://github.com/sebastianbergmann/comparator/security/policy",
+                "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1"
             },
             "funding": [
                 {
@@ -2496,20 +2501,20 @@
                     "type": "github"
                 }
             ],
-            "time": "2023-02-03T07:07:16+00:00"
+            "time": "2023-08-14T13:18:12+00:00"
         },
         {
             "name": "sebastian/complexity",
-            "version": "3.0.0",
+            "version": "3.0.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/complexity.git",
-                "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6"
+                "reference": "c70b73893e10757af9c6a48929fa6a333b56a97a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/e67d240970c9dc7ea7b2123a6d520e334dd61dc6",
-                "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6",
+                "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/c70b73893e10757af9c6a48929fa6a333b56a97a",
+                "reference": "c70b73893e10757af9c6a48929fa6a333b56a97a",
                 "shasum": ""
             },
             "require": {
@@ -2545,7 +2550,8 @@
             "homepage": "https://github.com/sebastianbergmann/complexity",
             "support": {
                 "issues": "https://github.com/sebastianbergmann/complexity/issues",
-                "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.0"
+                "security": "https://github.com/sebastianbergmann/complexity/security/policy",
+                "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.1"
             },
             "funding": [
                 {
@@ -2553,20 +2559,20 @@
                     "type": "github"
                 }
             ],
-            "time": "2023-02-03T06:59:47+00:00"
+            "time": "2023-08-31T09:55:53+00:00"
         },
         {
             "name": "sebastian/diff",
-            "version": "5.0.0",
+            "version": "5.0.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/diff.git",
-                "reference": "70dd1b20bc198da394ad542e988381b44e64e39f"
+                "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/70dd1b20bc198da394ad542e988381b44e64e39f",
-                "reference": "70dd1b20bc198da394ad542e988381b44e64e39f",
+                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/912dc2fbe3e3c1e7873313cc801b100b6c68c87b",
+                "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b",
                 "shasum": ""
             },
             "require": {
@@ -2611,7 +2617,8 @@
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/diff/issues",
-                "source": "https://github.com/sebastianbergmann/diff/tree/5.0.0"
+                "security": "https://github.com/sebastianbergmann/diff/security/policy",
+                "source": "https://github.com/sebastianbergmann/diff/tree/5.0.3"
             },
             "funding": [
                 {
@@ -2619,20 +2626,20 @@
                     "type": "github"
                 }
             ],
-            "time": "2023-02-03T07:00:31+00:00"
+            "time": "2023-05-01T07:48:21+00:00"
         },
         {
             "name": "sebastian/environment",
-            "version": "6.0.0",
+            "version": "6.0.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/environment.git",
-                "reference": "b6f3694c6386c7959915a0037652e0c40f6f69cc"
+                "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/b6f3694c6386c7959915a0037652e0c40f6f69cc",
-                "reference": "b6f3694c6386c7959915a0037652e0c40f6f69cc",
+                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951",
+                "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951",
                 "shasum": ""
             },
             "require": {
@@ -2674,7 +2681,8 @@
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/environment/issues",
-                "source": "https://github.com/sebastianbergmann/environment/tree/6.0.0"
+                "security": "https://github.com/sebastianbergmann/environment/security/policy",
+                "source": "https://github.com/sebastianbergmann/environment/tree/6.0.1"
             },
             "funding": [
                 {
@@ -2682,20 +2690,20 @@
                     "type": "github"
                 }
             ],
-            "time": "2023-02-03T07:03:04+00:00"
+            "time": "2023-04-11T05:39:26+00:00"
         },
         {
             "name": "sebastian/exporter",
-            "version": "5.0.0",
+            "version": "5.0.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/exporter.git",
-                "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0"
+                "reference": "32ff03d078fed1279c4ec9a407d08c5e9febb480"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0",
-                "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0",
+                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/32ff03d078fed1279c4ec9a407d08c5e9febb480",
+                "reference": "32ff03d078fed1279c4ec9a407d08c5e9febb480",
                 "shasum": ""
             },
             "require": {
@@ -2751,7 +2759,8 @@
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/exporter/issues",
-                "source": "https://github.com/sebastianbergmann/exporter/tree/5.0.0"
+                "security": "https://github.com/sebastianbergmann/exporter/security/policy",
+                "source": "https://github.com/sebastianbergmann/exporter/tree/5.0.1"
             },
             "funding": [
                 {
@@ -2759,20 +2768,20 @@
                     "type": "github"
                 }
             ],
-            "time": "2023-02-03T07:06:49+00:00"
+            "time": "2023-09-08T04:46:58+00:00"
         },
         {
             "name": "sebastian/global-state",
-            "version": "6.0.0",
+            "version": "6.0.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/global-state.git",
-                "reference": "aab257c712de87b90194febd52e4d184551c2d44"
+                "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/aab257c712de87b90194febd52e4d184551c2d44",
-                "reference": "aab257c712de87b90194febd52e4d184551c2d44",
+                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/7ea9ead78f6d380d2a667864c132c2f7b83055e4",
+                "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4",
                 "shasum": ""
             },
             "require": {
@@ -2812,7 +2821,8 @@
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/global-state/issues",
-                "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.0"
+                "security": "https://github.com/sebastianbergmann/global-state/security/policy",
+                "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.1"
             },
             "funding": [
                 {
@@ -2820,20 +2830,20 @@
                     "type": "github"
                 }
             ],
-            "time": "2023-02-03T07:07:38+00:00"
+            "time": "2023-07-19T07:19:23+00:00"
         },
         {
             "name": "sebastian/lines-of-code",
-            "version": "2.0.0",
+            "version": "2.0.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/lines-of-code.git",
-                "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130"
+                "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/17c4d940ecafb3d15d2cf916f4108f664e28b130",
-                "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130",
+                "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/649e40d279e243d985aa8fb6e74dd5bb28dc185d",
+                "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d",
                 "shasum": ""
             },
             "require": {
@@ -2869,7 +2879,8 @@
             "homepage": "https://github.com/sebastianbergmann/lines-of-code",
             "support": {
                 "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
-                "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.0"
+                "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy",
+                "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.1"
             },
             "funding": [
                 {
@@ -2877,7 +2888,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2023-02-03T07:08:02+00:00"
+            "time": "2023-08-31T09:25:50+00:00"
         },
         {
             "name": "sebastian/object-enumerator",
@@ -3165,16 +3176,16 @@
         },
         {
             "name": "seld/jsonlint",
-            "version": "1.9.0",
+            "version": "1.10.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/Seldaek/jsonlint.git",
-                "reference": "4211420d25eba80712bff236a98960ef68b866b7"
+                "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7",
-                "reference": "4211420d25eba80712bff236a98960ef68b866b7",
+                "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/594fd6462aad8ecee0b45ca5045acea4776667f1",
+                "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1",
                 "shasum": ""
             },
             "require": {
@@ -3213,7 +3224,7 @@
             ],
             "support": {
                 "issues": "https://github.com/Seldaek/jsonlint/issues",
-                "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0"
+                "source": "https://github.com/Seldaek/jsonlint/tree/1.10.0"
             },
             "funding": [
                 {
@@ -3225,7 +3236,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-04-01T13:37:23+00:00"
+            "time": "2023-05-11T13:16:46+00:00"
         },
         {
             "name": "slevomat/coding-standard",
@@ -3290,16 +3301,16 @@
         },
         {
             "name": "spatie/array-to-xml",
-            "version": "3.1.5",
+            "version": "3.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/spatie/array-to-xml.git",
-                "reference": "13f76acef5362d15c71ae1ac6350cc3df5e25e43"
+                "reference": "f9ab39c808500c347d5a8b6b13310bd5221e39e7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/13f76acef5362d15c71ae1ac6350cc3df5e25e43",
-                "reference": "13f76acef5362d15c71ae1ac6350cc3df5e25e43",
+                "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/f9ab39c808500c347d5a8b6b13310bd5221e39e7",
+                "reference": "f9ab39c808500c347d5a8b6b13310bd5221e39e7",
                 "shasum": ""
             },
             "require": {
@@ -3337,7 +3348,7 @@
                 "xml"
             ],
             "support": {
-                "source": "https://github.com/spatie/array-to-xml/tree/3.1.5"
+                "source": "https://github.com/spatie/array-to-xml/tree/3.2.0"
             },
             "funding": [
                 {
@@ -3349,7 +3360,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2022-12-24T13:43:51+00:00"
+            "time": "2023-07-19T18:30:26+00:00"
         },
         {
             "name": "squizlabs/php_codesniffer",
@@ -3410,23 +3421,23 @@
         },
         {
             "name": "symfony/console",
-            "version": "v6.2.7",
+            "version": "v6.3.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/console.git",
-                "reference": "cbad09eb8925b6ad4fb721c7a179344dc4a19d45"
+                "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/console/zipball/cbad09eb8925b6ad4fb721c7a179344dc4a19d45",
-                "reference": "cbad09eb8925b6ad4fb721c7a179344dc4a19d45",
+                "url": "https://api.github.com/repos/symfony/console/zipball/eca495f2ee845130855ddf1cf18460c38966c8b6",
+                "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6",
                 "shasum": ""
             },
             "require": {
                 "php": ">=8.1",
-                "symfony/deprecation-contracts": "^2.1|^3",
+                "symfony/deprecation-contracts": "^2.5|^3",
                 "symfony/polyfill-mbstring": "~1.0",
-                "symfony/service-contracts": "^1.1|^2|^3",
+                "symfony/service-contracts": "^2.5|^3",
                 "symfony/string": "^5.4|^6.0"
             },
             "conflict": {
@@ -3448,12 +3459,6 @@
                 "symfony/process": "^5.4|^6.0",
                 "symfony/var-dumper": "^5.4|^6.0"
             },
-            "suggest": {
-                "psr/log": "For using the console logger",
-                "symfony/event-dispatcher": "",
-                "symfony/lock": "",
-                "symfony/process": ""
-            },
             "type": "library",
             "autoload": {
                 "psr-4": {
@@ -3481,12 +3486,12 @@
             "homepage": "https://symfony.com",
             "keywords": [
                 "cli",
-                "command line",
+                "command-line",
                 "console",
                 "terminal"
             ],
             "support": {
-                "source": "https://github.com/symfony/console/tree/v6.2.7"
+                "source": "https://github.com/symfony/console/tree/v6.3.4"
             },
             "funding": [
                 {
@@ -3502,20 +3507,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2023-02-25T17:00:03+00:00"
+            "time": "2023-08-16T10:10:12+00:00"
         },
         {
             "name": "symfony/deprecation-contracts",
-            "version": "v3.2.1",
+            "version": "v3.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/deprecation-contracts.git",
-                "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e"
+                "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e",
-                "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e",
+                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf",
+                "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf",
                 "shasum": ""
             },
             "require": {
@@ -3524,7 +3529,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "3.3-dev"
+                    "dev-main": "3.4-dev"
                 },
                 "thanks": {
                     "name": "symfony/contracts",
@@ -3553,7 +3558,7 @@
             "description": "A generic function and convention to trigger deprecation notices",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.1"
+                "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0"
             },
             "funding": [
                 {
@@ -3569,20 +3574,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2023-03-01T10:25:55+00:00"
+            "time": "2023-05-23T14:45:45+00:00"
         },
         {
             "name": "symfony/filesystem",
-            "version": "v6.2.7",
+            "version": "v6.3.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/filesystem.git",
-                "reference": "82b6c62b959f642d000456f08c6d219d749215b3"
+                "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/filesystem/zipball/82b6c62b959f642d000456f08c6d219d749215b3",
-                "reference": "82b6c62b959f642d000456f08c6d219d749215b3",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae",
+                "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae",
                 "shasum": ""
             },
             "require": {
@@ -3616,7 +3621,7 @@
             "description": "Provides basic utilities for the filesystem",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/filesystem/tree/v6.2.7"
+                "source": "https://github.com/symfony/filesystem/tree/v6.3.1"
             },
             "funding": [
                 {
@@ -3632,20 +3637,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2023-02-14T08:44:56+00:00"
+            "time": "2023-06-01T08:30:39+00:00"
         },
         {
             "name": "symfony/finder",
-            "version": "v6.2.7",
+            "version": "v6.3.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/finder.git",
-                "reference": "20808dc6631aecafbe67c186af5dcb370be3a0eb"
+                "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/finder/zipball/20808dc6631aecafbe67c186af5dcb370be3a0eb",
-                "reference": "20808dc6631aecafbe67c186af5dcb370be3a0eb",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/9915db259f67d21eefee768c1abcf1cc61b1fc9e",
+                "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e",
                 "shasum": ""
             },
             "require": {
@@ -3680,7 +3685,7 @@
             "description": "Finds files and directories via an intuitive fluent interface",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/finder/tree/v6.2.7"
+                "source": "https://github.com/symfony/finder/tree/v6.3.3"
             },
             "funding": [
                 {
@@ -3696,25 +3701,25 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2023-02-16T09:57:23+00:00"
+            "time": "2023-07-31T08:31:44+00:00"
         },
         {
             "name": "symfony/options-resolver",
-            "version": "v6.2.7",
+            "version": "v6.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/options-resolver.git",
-                "reference": "aa0e85b53bbb2b4951960efd61d295907eacd629"
+                "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/options-resolver/zipball/aa0e85b53bbb2b4951960efd61d295907eacd629",
-                "reference": "aa0e85b53bbb2b4951960efd61d295907eacd629",
+                "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a10f19f5198d589d5c33333cffe98dc9820332dd",
+                "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd",
                 "shasum": ""
             },
             "require": {
                 "php": ">=8.1",
-                "symfony/deprecation-contracts": "^2.1|^3"
+                "symfony/deprecation-contracts": "^2.5|^3"
             },
             "type": "library",
             "autoload": {
@@ -3747,7 +3752,7 @@
                 "options"
             ],
             "support": {
-                "source": "https://github.com/symfony/options-resolver/tree/v6.2.7"
+                "source": "https://github.com/symfony/options-resolver/tree/v6.3.0"
             },
             "funding": [
                 {
@@ -3763,20 +3768,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2023-02-14T08:44:56+00:00"
+            "time": "2023-05-12T14:21:09+00:00"
         },
         {
             "name": "symfony/polyfill-ctype",
-            "version": "v1.27.0",
+            "version": "v1.28.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-ctype.git",
-                "reference": "5bbc823adecdae860bb64756d639ecfec17b050a"
+                "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a",
-                "reference": "5bbc823adecdae860bb64756d639ecfec17b050a",
+                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
+                "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
                 "shasum": ""
             },
             "require": {
@@ -3791,7 +3796,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.27-dev"
+                    "dev-main": "1.28-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -3829,7 +3834,7 @@
                 "portable"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0"
+                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0"
             },
             "funding": [
                 {
@@ -3845,20 +3850,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-11-03T14:55:06+00:00"
+            "time": "2023-01-26T09:26:14+00:00"
         },
         {
             "name": "symfony/polyfill-intl-grapheme",
-            "version": "v1.27.0",
+            "version": "v1.28.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
-                "reference": "511a08c03c1960e08a883f4cffcacd219b758354"
+                "reference": "875e90aeea2777b6f135677f618529449334a612"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354",
-                "reference": "511a08c03c1960e08a883f4cffcacd219b758354",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612",
+                "reference": "875e90aeea2777b6f135677f618529449334a612",
                 "shasum": ""
             },
             "require": {
@@ -3870,7 +3875,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.27-dev"
+                    "dev-main": "1.28-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -3910,7 +3915,7 @@
                 "shim"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0"
+                "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0"
             },
             "funding": [
                 {
@@ -3926,20 +3931,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-11-03T14:55:06+00:00"
+            "time": "2023-01-26T09:26:14+00:00"
         },
         {
             "name": "symfony/polyfill-intl-normalizer",
-            "version": "v1.27.0",
+            "version": "v1.28.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
-                "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6"
+                "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6",
-                "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
+                "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
                 "shasum": ""
             },
             "require": {
@@ -3951,7 +3956,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.27-dev"
+                    "dev-main": "1.28-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -3994,7 +3999,7 @@
                 "shim"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0"
+                "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0"
             },
             "funding": [
                 {
@@ -4010,20 +4015,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-11-03T14:55:06+00:00"
+            "time": "2023-01-26T09:26:14+00:00"
         },
         {
             "name": "symfony/polyfill-mbstring",
-            "version": "v1.27.0",
+            "version": "v1.28.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-mbstring.git",
-                "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
+                "reference": "42292d99c55abe617799667f454222c54c60e229"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
-                "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229",
+                "reference": "42292d99c55abe617799667f454222c54c60e229",
                 "shasum": ""
             },
             "require": {
@@ -4038,7 +4043,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.27-dev"
+                    "dev-main": "1.28-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -4077,7 +4082,7 @@
                 "shim"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
+                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0"
             },
             "funding": [
                 {
@@ -4093,20 +4098,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-11-03T14:55:06+00:00"
+            "time": "2023-07-28T09:04:16+00:00"
         },
         {
             "name": "symfony/process",
-            "version": "v6.2.7",
+            "version": "v6.3.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/process.git",
-                "reference": "680e8a2ea6b3f87aecc07a6a65a203ae573d1902"
+                "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/process/zipball/680e8a2ea6b3f87aecc07a6a65a203ae573d1902",
-                "reference": "680e8a2ea6b3f87aecc07a6a65a203ae573d1902",
+                "url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54",
+                "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54",
                 "shasum": ""
             },
             "require": {
@@ -4138,7 +4143,7 @@
             "description": "Executes commands in sub-processes",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/process/tree/v6.2.7"
+                "source": "https://github.com/symfony/process/tree/v6.3.4"
             },
             "funding": [
                 {
@@ -4154,20 +4159,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2023-02-24T10:42:00+00:00"
+            "time": "2023-08-07T10:39:22+00:00"
         },
         {
             "name": "symfony/service-contracts",
-            "version": "v3.2.1",
+            "version": "v3.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/service-contracts.git",
-                "reference": "a8c9cedf55f314f3a186041d19537303766df09a"
+                "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a8c9cedf55f314f3a186041d19537303766df09a",
-                "reference": "a8c9cedf55f314f3a186041d19537303766df09a",
+                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4",
+                "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4",
                 "shasum": ""
             },
             "require": {
@@ -4177,13 +4182,10 @@
             "conflict": {
                 "ext-psr": "<1.1|>=2"
             },
-            "suggest": {
-                "symfony/service-implementation": ""
-            },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "3.3-dev"
+                    "dev-main": "3.4-dev"
                 },
                 "thanks": {
                     "name": "symfony/contracts",
@@ -4223,7 +4225,7 @@
                 "standards"
             ],
             "support": {
-                "source": "https://github.com/symfony/service-contracts/tree/v3.2.1"
+                "source": "https://github.com/symfony/service-contracts/tree/v3.3.0"
             },
             "funding": [
                 {
@@ -4239,20 +4241,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2023-03-01T10:32:47+00:00"
+            "time": "2023-05-23T14:45:45+00:00"
         },
         {
             "name": "symfony/string",
-            "version": "v6.2.7",
+            "version": "v6.3.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/string.git",
-                "reference": "67b8c1eec78296b85dc1c7d9743830160218993d"
+                "reference": "53d1a83225002635bca3482fcbf963001313fb68"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/string/zipball/67b8c1eec78296b85dc1c7d9743830160218993d",
-                "reference": "67b8c1eec78296b85dc1c7d9743830160218993d",
+                "url": "https://api.github.com/repos/symfony/string/zipball/53d1a83225002635bca3482fcbf963001313fb68",
+                "reference": "53d1a83225002635bca3482fcbf963001313fb68",
                 "shasum": ""
             },
             "require": {
@@ -4263,13 +4265,13 @@
                 "symfony/polyfill-mbstring": "~1.0"
             },
             "conflict": {
-                "symfony/translation-contracts": "<2.0"
+                "symfony/translation-contracts": "<2.5"
             },
             "require-dev": {
                 "symfony/error-handler": "^5.4|^6.0",
                 "symfony/http-client": "^5.4|^6.0",
                 "symfony/intl": "^6.2",
-                "symfony/translation-contracts": "^2.0|^3.0",
+                "symfony/translation-contracts": "^2.5|^3.0",
                 "symfony/var-exporter": "^5.4|^6.0"
             },
             "type": "library",
@@ -4309,7 +4311,7 @@
                 "utf8"
             ],
             "support": {
-                "source": "https://github.com/symfony/string/tree/v6.2.7"
+                "source": "https://github.com/symfony/string/tree/v6.3.2"
             },
             "funding": [
                 {
@@ -4325,7 +4327,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2023-02-24T10:42:00+00:00"
+            "time": "2023-07-05T08:41:27+00:00"
         },
         {
             "name": "theseer/tokenizer",
@@ -4379,16 +4381,16 @@
         },
         {
             "name": "vimeo/psalm",
-            "version": "5.8.0",
+            "version": "5.15.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/vimeo/psalm.git",
-                "reference": "9cf4f60a333f779ad3bc704a555920e81d4fdcda"
+                "reference": "5c774aca4746caf3d239d9c8cadb9f882ca29352"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/vimeo/psalm/zipball/9cf4f60a333f779ad3bc704a555920e81d4fdcda",
-                "reference": "9cf4f60a333f779ad3bc704a555920e81d4fdcda",
+                "url": "https://api.github.com/repos/vimeo/psalm/zipball/5c774aca4746caf3d239d9c8cadb9f882ca29352",
+                "reference": "5c774aca4746caf3d239d9c8cadb9f882ca29352",
                 "shasum": ""
             },
             "require": {
@@ -4409,17 +4411,21 @@
                 "felixfbecker/language-server-protocol": "^1.5.2",
                 "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1",
                 "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0",
-                "nikic/php-parser": "^4.14",
-                "php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0",
+                "nikic/php-parser": "^4.16",
+                "php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0",
                 "sebastian/diff": "^4.0 || ^5.0",
                 "spatie/array-to-xml": "^2.17.0 || ^3.0",
                 "symfony/console": "^4.1.6 || ^5.0 || ^6.0",
                 "symfony/filesystem": "^5.4 || ^6.0"
             },
+            "conflict": {
+                "nikic/php-parser": "4.17.0"
+            },
             "provide": {
                 "psalm/psalm": "self.version"
             },
             "require-dev": {
+                "amphp/phpunit-util": "^2.0",
                 "bamarni/composer-bin-plugin": "^1.4",
                 "brianium/paratest": "^6.9",
                 "ext-curl": "*",
@@ -4478,9 +4484,9 @@
             ],
             "support": {
                 "issues": "https://github.com/vimeo/psalm/issues",
-                "source": "https://github.com/vimeo/psalm/tree/5.8.0"
+                "source": "https://github.com/vimeo/psalm/tree/5.15.0"
             },
-            "time": "2023-03-09T04:14:35+00:00"
+            "time": "2023-08-20T23:07:30+00:00"
         },
         {
             "name": "webimpress/coding-standard",
@@ -4651,11 +4657,11 @@
     "prefer-stable": false,
     "prefer-lowest": false,
     "platform": {
-        "php": "~8.1.0 || ~8.2.0"
+        "php": "~8.1.0 || ~8.2.0 || ~8.3.0"
     },
     "platform-dev": [],
     "platform-overrides": {
         "php": "8.1.99"
     },
-    "plugin-api-version": "2.3.0"
+    "plugin-api-version": "2.6.0"
 }
diff --git a/docs/book/console-helper.md b/docs/book/v3/console-helper.md
similarity index 100%
rename from docs/book/console-helper.md
rename to docs/book/v3/console-helper.md
diff --git a/docs/book/migration.md b/docs/book/v3/migration.md
similarity index 100%
rename from docs/book/migration.md
rename to docs/book/v3/migration.md
diff --git a/mkdocs.yml b/mkdocs.yml
index b19b2f3eea607f084c83e57fb1dafe668708c533..fa4ffa0817c0961e02cb5c6bc33f82d304c821e0 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -2,11 +2,19 @@ docs_dir: docs/book
 site_dir: docs/html
 nav:
     - Home: index.md
-    - Reference:
-      - "Console Helper": console-helper.md
-    - Migration: migration.md
+    - v3:
+      - "Console Helper": v3/console-helper.md
+      - Migration: v3/migration.md
 site_name: laminas-stdlib
 site_description: Laminas\Stdlib
 repo_url: 'https://github.com/laminas/laminas-stdlib'
 extra:
     project: Components
+    current_version: v3
+    versions:
+      - v3
+plugins:
+  - redirects:
+      redirect_maps:
+        migration.md: v3/migration.md
+        console-helper.md: v3/console-helper.md
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
index 120607b80334b420680863139be00478fb25b5d2..58595928970eb6f9a144e4efa0c7bc5e0ace1f2e 100644
--- a/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -12,15 +12,14 @@
     displayDetailsOnIncompleteTests="true"
     displayDetailsOnSkippedTests="true"
 >
-  <coverage>
-    <include>
-      <directory suffix=".php">./src</directory>
-    </include>
-  </coverage>
-
-  <testsuites>
-    <testsuite name="laminas-stdlib Test Suite">
-      <directory>./test</directory>
-    </testsuite>
-  </testsuites>
+    <testsuites>
+        <testsuite name="laminas-stdlib Test Suite">
+            <directory>./test</directory>
+        </testsuite>
+    </testsuites>
+    <source>
+        <include>
+            <directory suffix=".php">./src</directory>
+        </include>
+    </source>
 </phpunit>
diff --git a/psalm-baseline.xml b/psalm-baseline.xml
index 0d87178d7aab399028284d48e6508e09e75924a5..1fb24768f0e12edee59861baa751911155be8fb0 100644
--- a/psalm-baseline.xml
+++ b/psalm-baseline.xml
@@ -1,25 +1,21 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<files psalm-version="5.8.0@9cf4f60a333f779ad3bc704a555920e81d4fdcda">
+<files psalm-version="5.15.0@5c774aca4746caf3d239d9c8cadb9f882ca29352">
   <file src="src/AbstractOptions.php">
     <DocblockTypeContradiction>
       <code><![CDATA[! is_array($options) && ! $options instanceof Traversable]]></code>
     </DocblockTypeContradiction>
     <MixedArgument>
-      <code>$key</code>
-      <code>$key</code>
-      <code>$letter</code>
+      <code>$value</code>
     </MixedArgument>
     <MixedAssignment>
-      <code>$array[$normalizedKey]</code>
-      <code>$key</code>
-      <code>$key</code>
-      <code>$letter</code>
-      <code>$value</code>
       <code>$value</code>
     </MixedAssignment>
-    <RawObjectIteration>
-      <code>$this</code>
-    </RawObjectIteration>
+    <MixedInferredReturnType>
+      <code>TValue</code>
+    </MixedInferredReturnType>
+    <MixedReturnStatement>
+      <code><![CDATA[$this->{$getter}()]]></code>
+    </MixedReturnStatement>
   </file>
   <file src="src/ArrayObject.php">
     <ArgumentTypeCoercion>
@@ -67,9 +63,9 @@
       <code>is_callable($function)</code>
       <code>is_callable($function)</code>
     </RedundantConditionGivenDocblockType>
-    <UndefinedAttributeClass>
-      <code>AllowDynamicProperties</code>
-    </UndefinedAttributeClass>
+    <UnsupportedPropertyReferenceUsage>
+      <code><![CDATA[$ret = &$this->storage[$key]]]></code>
+    </UnsupportedPropertyReferenceUsage>
     <UnsupportedReferenceUsage>
       <code><![CDATA[$ret = &$this->offsetGet($key)]]></code>
     </UnsupportedReferenceUsage>
@@ -107,6 +103,7 @@
   <file src="src/FastPriorityQueue.php">
     <DocblockTypeContradiction>
       <code>is_int($priority)</code>
+      <code><![CDATA[throw new Exception\InvalidArgumentException("The extract flag specified is not valid")]]></code>
     </DocblockTypeContradiction>
     <ImplementedReturnTypeMismatch>
       <code>TValue|int|array{data: TValue|false, priority: int|null}|false</code>
@@ -147,6 +144,9 @@
     </PossiblyNullArrayOffset>
   </file>
   <file src="src/Glob.php">
+    <ArgumentTypeCoercion>
+      <code>$globFlags</code>
+    </ArgumentTypeCoercion>
     <PossiblyNullArrayOffset>
       <code>$pattern</code>
     </PossiblyNullArrayOffset>
@@ -303,15 +303,9 @@
       <code><![CDATA['Bacon']]></code>
     </InvalidArgument>
     <MissingClosureParamType>
-      <code>$a</code>
       <code>$a</code>
       <code>$b</code>
-      <code>$b</code>
     </MissingClosureParamType>
-    <MixedArgument>
-      <code>$a</code>
-      <code>$b</code>
-    </MixedArgument>
     <MixedAssignment>
       <code>$unserialized</code>
     </MixedAssignment>
@@ -336,6 +330,10 @@
     </UndefinedInterfaceMethod>
   </file>
   <file src="test/ArrayUtilsTest.php">
+    <DeprecatedConstant>
+      <code>ArrayUtils::ARRAY_FILTER_USE_BOTH</code>
+      <code>ArrayUtils::ARRAY_FILTER_USE_KEY</code>
+    </DeprecatedConstant>
     <DeprecatedMethod>
       <code>ArrayUtils::filter($data, $callback, $flag)</code>
       <code><![CDATA[ArrayUtils::filter([], "INVALID")]]></code>
@@ -343,9 +341,6 @@
     <DuplicateArrayKey>
       <code><![CDATA['-10000' => null]]></code>
     </DuplicateArrayKey>
-    <MissingClosureParamType>
-      <code>$key</code>
-    </MissingClosureParamType>
     <MixedArgument>
       <code>$test</code>
     </MixedArgument>
@@ -373,37 +368,15 @@
     </UndefinedInterfaceMethod>
   </file>
   <file src="test/FastPriorityQueueTest.php">
-    <InvalidArgument>
-      <code><![CDATA['foo']]></code>
-    </InvalidArgument>
-    <MissingClosureParamType>
-      <code>$e</code>
-      <code>$e</code>
-    </MissingClosureParamType>
-    <MixedArgument>
-      <code>$unserialized</code>
-      <code>$unserialized</code>
-    </MixedArgument>
     <MixedAssignment>
       <code>$datum</code>
-      <code>$expected[]</code>
-      <code>$item</code>
       <code>$item</code>
-      <code>$item</code>
-      <code>$item</code>
-      <code>$item</code>
-      <code>$test[]</code>
-      <code>$test[]</code>
       <code>$test[]</code>
       <code>$test[]</code>
       <code>$test[]</code>
       <code>$test[]</code>
       <code>$test[]</code>
       <code>$test[]</code>
-      <code>$test[]</code>
-      <code>$unserialized</code>
-      <code>$value</code>
-      <code>$value</code>
       <code>$value</code>
       <code>$value</code>
       <code>$value</code>
@@ -412,33 +385,13 @@
   </file>
   <file src="test/GlobTest.php">
     <MixedArgument>
-      <code>$expectedFileName</code>
       <code>$result[$i]</code>
     </MixedArgument>
-    <MixedAssignment>
-      <code>$expectedFileName</code>
-    </MixedAssignment>
     <RedundantConditionGivenDocblockType>
       <code>assertIsArray</code>
     </RedundantConditionGivenDocblockType>
   </file>
-  <file src="test/OptionsTest.php">
-    <InternalMethod>
-      <code>addToAssertionCount</code>
-    </InternalMethod>
-    <InvalidArgument>
-      <code><![CDATA['asd']]></code>
-      <code><![CDATA[new TestOptions(['test_field' => 1])]]></code>
-    </InvalidArgument>
-  </file>
   <file src="test/ParametersTest.php">
-    <ArgumentTypeCoercion>
-      <code><![CDATA['ArrayAccess']]></code>
-      <code><![CDATA['ArrayObject']]></code>
-      <code><![CDATA['Countable']]></code>
-      <code><![CDATA['Serializable']]></code>
-      <code><![CDATA['Traversable']]></code>
-    </ArgumentTypeCoercion>
     <UndefinedPropertyFetch>
       <code><![CDATA[$parameters->bar]]></code>
       <code><![CDATA[$parameters->baz]]></code>
@@ -448,66 +401,4 @@
       <code><![CDATA[$parameters->foof]]></code>
     </UndefinedPropertyFetch>
   </file>
-  <file src="test/PriorityListTest.php">
-    <NullArgument>
-      <code>null</code>
-      <code>null</code>
-      <code>null</code>
-      <code>null</code>
-      <code>null</code>
-    </NullArgument>
-    <TypeDoesNotContainType>
-      <code>assertEmpty</code>
-    </TypeDoesNotContainType>
-  </file>
-  <file src="test/PriorityQueueTest.php">
-    <MixedArgument>
-      <code>$unserialized</code>
-      <code>$unserialized</code>
-      <code>$unserialized</code>
-    </MixedArgument>
-    <MixedAssignment>
-      <code>$item</code>
-      <code>$test[]</code>
-      <code>$unserialized</code>
-    </MixedAssignment>
-  </file>
-  <file src="test/SplQueueTest.php">
-    <MixedArgument>
-      <code>$unserialized</code>
-      <code>$unserialized</code>
-    </MixedArgument>
-    <MixedAssignment>
-      <code>$unserialized</code>
-    </MixedAssignment>
-  </file>
-  <file src="test/SplStackTest.php">
-    <MixedArgument>
-      <code>$unserialized</code>
-      <code>$unserialized</code>
-    </MixedArgument>
-    <MixedAssignment>
-      <code>$unserialized</code>
-    </MixedAssignment>
-  </file>
-  <file src="test/StringUtilsTest.php">
-    <MixedArgument>
-      <code>$str</code>
-    </MixedArgument>
-  </file>
-  <file src="test/StringWrapper/IconvTest.php">
-    <TooManyArguments>
-      <code><![CDATA[new Iconv('utf-8')]]></code>
-    </TooManyArguments>
-  </file>
-  <file src="test/StringWrapper/IntlTest.php">
-    <TooManyArguments>
-      <code><![CDATA[new Intl('utf-8')]]></code>
-    </TooManyArguments>
-  </file>
-  <file src="test/StringWrapper/MbStringTest.php">
-    <TooManyArguments>
-      <code><![CDATA[new MbString('utf-8')]]></code>
-    </TooManyArguments>
-  </file>
 </files>
diff --git a/src/AbstractOptions.php b/src/AbstractOptions.php
index d02221ab163646ee03c0c5bc3a39b6bda5b0bc27..5db2ea95bd1d716d7e11bf2bf3b26bdb5ce5c4ad 100644
--- a/src/AbstractOptions.php
+++ b/src/AbstractOptions.php
@@ -7,6 +7,7 @@ namespace Laminas\Stdlib;
 use Traversable;
 
 use function array_shift;
+use function get_object_vars;
 use function is_array;
 use function is_callable;
 use function method_exists;
@@ -16,6 +17,10 @@ use function str_replace;
 use function strtolower;
 use function ucwords;
 
+/**
+ * @template TValue
+ * @implements ParameterObjectInterface<string, TValue>
+ */
 abstract class AbstractOptions implements ParameterObjectInterface
 {
     // phpcs:disable PSR2.Classes.PropertyDeclaration.Underscore,WebimpressCodingStandard.NamingConventions.ValidVariableName.NotCamelCapsProperty
@@ -33,7 +38,7 @@ abstract class AbstractOptions implements ParameterObjectInterface
     /**
      * Constructor
      *
-     * @param  array|Traversable|null $options
+     * @param  iterable<string, TValue>|AbstractOptions<TValue>|null $options
      */
     public function __construct($options = null)
     {
@@ -45,7 +50,7 @@ abstract class AbstractOptions implements ParameterObjectInterface
     /**
      * Set one or more configuration properties
      *
-     * @param  array|Traversable|AbstractOptions $options
+     * @param  iterable<string, TValue>|AbstractOptions<TValue> $options
      * @throws Exception\InvalidArgumentException
      * @return AbstractOptions Provides fluent interface
      */
@@ -77,19 +82,20 @@ abstract class AbstractOptions implements ParameterObjectInterface
     /**
      * Cast to array
      *
-     * @return array
+     * @return array<string, TValue>
      */
     public function toArray()
     {
         $array = [];
 
-        /** @param string[] $letters */
         $transform = static function (array $letters): string {
+            /** @var list<string> $letters */
             $letter = array_shift($letters);
             return '_' . strtolower($letter);
         };
 
-        foreach ($this as $key => $value) {
+        /** @psalm-var TValue $value */
+        foreach (get_object_vars($this) as $key => $value) {
             if ($key === '__strictMode__') {
                 continue;
             }
@@ -106,7 +112,7 @@ abstract class AbstractOptions implements ParameterObjectInterface
      * @see ParameterObject::__set()
      *
      * @param string $key
-     * @param mixed $value
+     * @param TValue|null $value
      * @throws Exception\BadMethodCallException
      * @return void
      */
@@ -137,7 +143,7 @@ abstract class AbstractOptions implements ParameterObjectInterface
      *
      * @param string $key
      * @throws Exception\BadMethodCallException
-     * @return mixed
+     * @return TValue
      */
     public function __get($key)
     {
diff --git a/src/ArrayUtils.php b/src/ArrayUtils.php
index 75ddd529f041f84f3b1c0328aa99b344d9cef1d7..935d98894fa01f0e3f7bb8680b027f736f3abbcc 100644
--- a/src/ArrayUtils.php
+++ b/src/ArrayUtils.php
@@ -35,11 +35,15 @@ abstract class ArrayUtils
 {
     /**
      * Compatibility Flag for ArrayUtils::filter
+     *
+     * @deprecated
      */
     public const ARRAY_FILTER_USE_BOTH = 1;
 
     /**
      * Compatibility Flag for ArrayUtils::filter
+     *
+     * @deprecated
      */
     public const ARRAY_FILTER_USE_KEY = 2;
 
diff --git a/src/ParameterObjectInterface.php b/src/ParameterObjectInterface.php
index b091c107e2db6ede3842583c4fa5490f0724b8fd..39e5ffce36ec67b79f22a33dd4165353042f90e9 100644
--- a/src/ParameterObjectInterface.php
+++ b/src/ParameterObjectInterface.php
@@ -4,28 +4,33 @@ declare(strict_types=1);
 
 namespace Laminas\Stdlib;
 
+/**
+ * @template TKey of string
+ * @template TValue
+ */
 interface ParameterObjectInterface
 {
     /**
-     * @param string $key
+     * @param TKey $key
+     * @param TValue|null $value
      * @return void
      */
     public function __set($key, mixed $value);
 
     /**
-     * @param string $key
-     * @return mixed
+     * @param TKey $key
+     * @return TValue
      */
     public function __get($key);
 
     /**
-     * @param string $key
+     * @param TKey $key
      * @return bool
      */
     public function __isset($key);
 
     /**
-     * @param string $key
+     * @param TKey $key
      * @return void
      */
     public function __unset($key);
diff --git a/test/ArrayObjectTest.php b/test/ArrayObjectTest.php
index b8fd19c18391683cb125fc1fc288aa4cb7c7b64f..880288cdaf99cf283e96378a8aa84d8a252587e7 100644
--- a/test/ArrayObjectTest.php
+++ b/test/ArrayObjectTest.php
@@ -369,7 +369,7 @@ class ArrayObjectTest extends TestCase
 
     public function testUksort(): void
     {
-        $function = static function ($a, $b): int {
+        $function = static function (string $a, string $b): int {
             $a = preg_replace('@^(a|an|the) @', '', $a);
             $b = preg_replace('@^(a|an|the) @', '', $b);
             self::assertNotNull($a);
diff --git a/test/ArrayUtilsTest.php b/test/ArrayUtilsTest.php
index dcda16f1206cbd79125881ed878df4a961d510f7..5b3464d4cd724bfec47f75d8cc8e724104f253df 100644
--- a/test/ArrayUtilsTest.php
+++ b/test/ArrayUtilsTest.php
@@ -498,7 +498,7 @@ class ArrayUtilsTest extends TestCase
     /**
      * @psalm-return list<array{
      *     0: array<string, string>,
-     *     1: callable(string):bool,
+     *     1: callable(string, int|string=):bool,
      *     2: null|int,
      *     3: array<string, string>
      * }>
@@ -519,7 +519,7 @@ class ArrayUtilsTest extends TestCase
             ],
             [
                 ['foo' => 'bar', 'fiz' => 'buz'],
-                static function (string $value, $key): bool {
+                static function (string $value, int|string $key): bool {
                     if ($value === 'buz') {
                         return false;
                     }
diff --git a/test/FastPriorityQueueTest.php b/test/FastPriorityQueueTest.php
index af5aa00af6dd77da249ce48a7b4b7ad206b94d3c..5f918de01aa0bf902cd1af3b707bdbe1357d478a 100644
--- a/test/FastPriorityQueueTest.php
+++ b/test/FastPriorityQueueTest.php
@@ -21,14 +21,15 @@ use function var_export;
 #[Group('Laminas_Stdlib')]
 class FastPriorityQueueTest extends TestCase
 {
-    /** @var FastPriorityQueue */
-    protected $queue;
+    /** @var FastPriorityQueue<string> */
+    private FastPriorityQueue $queue;
 
     /** @var string[] */
-    protected $expected;
+    private array $expected;
 
     protected function setUp(): void
     {
+        /** @psalm-var FastPriorityQueue<string> $this->queue */
         $this->queue = new FastPriorityQueue();
         $this->insertDataQueue($this->queue);
         $this->expected = [
@@ -107,7 +108,8 @@ class FastPriorityQueueTest extends TestCase
     {
         $s            = serialize($this->queue);
         $unserialized = unserialize($s);
-        $count        = count($this->queue);
+        self::assertInstanceOf(FastPriorityQueue::class, $unserialized);
+        $count = count($this->queue);
         self::assertSame(
             $count,
             count($unserialized),
@@ -168,6 +170,7 @@ class FastPriorityQueueTest extends TestCase
     {
         $this->expectException(InvalidArgumentException::class);
         $this->expectExceptionMessage('The extract flag specified is not valid');
+        /** @psalm-suppress InvalidArgument */
         $this->queue->setExtractFlags('foo');
     }
 
@@ -191,7 +194,7 @@ class FastPriorityQueueTest extends TestCase
 
     public function testHasPriority(): void
     {
-        foreach ($this->getDataPriorityQueue() as $value => $priority) {
+        foreach ($this->getDataPriorityQueue() as $priority) {
             self::assertTrue($this->queue->hasPriority($priority));
         }
         self::assertFalse($this->queue->hasPriority(10000));
@@ -211,7 +214,7 @@ class FastPriorityQueueTest extends TestCase
         self::assertEquals($expected, $test);
     }
 
-    public function testRemoveOnlyTheFirstOccurenceFromQueue(): void
+    public function testRemoveOnlyTheFirstOccurrenceFromQueue(): void
     {
         $data = $this->getDataPriorityQueue();
         $this->queue->insert('test2', $data['test2']);
@@ -246,7 +249,7 @@ class FastPriorityQueueTest extends TestCase
 
     public function testRemoveShouldFindItemEvenIfMultipleItemsAreInQueue(): void
     {
-        $prototype = static function ($e): void {
+        $prototype = static function (): void {
         };
 
         $queue = new FastPriorityQueue();
@@ -268,7 +271,7 @@ class FastPriorityQueueTest extends TestCase
 
     public function testIterativelyRemovingItemsShouldRemoveAllItems(): void
     {
-        $prototype = static function ($e): void {
+        $prototype = static function (): void {
         };
 
         $queue = new FastPriorityQueue();
diff --git a/test/GlobTest.php b/test/GlobTest.php
index b5932b0b6d6b85905af31aa33d3729097e9ef0a3..32895b8b0cdfdc2bfadfce5190d4d4543e185d79 100644
--- a/test/GlobTest.php
+++ b/test/GlobTest.php
@@ -60,6 +60,7 @@ class GlobTest extends TestCase
         Glob::glob($path);
     }
 
+    /** @param list<non-empty-string> $expectedSequence */
     #[DataProvider('patternsProvider')]
     public function testPatterns(string $pattern, array $expectedSequence): void
     {
@@ -75,7 +76,7 @@ class GlobTest extends TestCase
     /**
      * @psalm-return array<array-key, array{
      *     0: string,
-     *     1: string[]
+     *     1: list<non-empty-string>
      * }>
      */
     public static function patternsProvider(): array
diff --git a/test/OptionsTest.php b/test/OptionsTest.php
index 10f520df293047bf54af4bf33d8f6b979d192d67..0bcce63ba19e0ac3340f89f696d4d1bd24aa83aa 100644
--- a/test/OptionsTest.php
+++ b/test/OptionsTest.php
@@ -63,9 +63,9 @@ class OptionsTest extends TestCase
     {
         $options = new TestOptions(['test_field' => 1]);
 
-        self::assertEquals(true, isset($options->test_field));
+        self::assertTrue(isset($options->test_field));
         unset($options->testField);
-        self::assertEquals(false, isset($options->test_field));
+        self::assertFalse(isset($options->test_field));
     }
 
     public function testUnsetThrowsInvalidArgumentException(): void
@@ -99,6 +99,7 @@ class OptionsTest extends TestCase
     {
         $this->expectException(InvalidArgumentException::class);
         $options = new TestOptions();
+        /** @psalm-suppress InvalidArgument */
         $options->setFromArray('asd');
     }
 
@@ -179,9 +180,7 @@ class OptionsTest extends TestCase
     {
         $options = new TestOptionsWithoutGetter();
 
-        isset($options->foo);
-
-        $this->addToAssertionCount(1);
+        self::assertFalse(isset($options->foo));
     }
 
     #[Group('7287')]
diff --git a/test/ParametersTest.php b/test/ParametersTest.php
index ebd3f6bda19c2dc02c5b782786a2cc1c678f57a2..91923f2acec5b7818af22014f7f535f2e5212ee5 100644
--- a/test/ParametersTest.php
+++ b/test/ParametersTest.php
@@ -4,9 +4,14 @@ declare(strict_types=1);
 
 namespace LaminasTest\Stdlib;
 
+use ArrayAccess;
+use ArrayObject;
+use Countable;
 use Laminas\Stdlib\Parameters;
 use Laminas\Stdlib\ParametersInterface;
 use PHPUnit\Framework\TestCase;
+use Serializable;
+use Traversable;
 
 class ParametersTest extends TestCase
 {
@@ -14,11 +19,11 @@ class ParametersTest extends TestCase
     {
         $parameters = new Parameters();
         self::assertInstanceOf(ParametersInterface::class, $parameters);
-        self::assertInstanceOf('ArrayObject', $parameters);
-        self::assertInstanceOf('ArrayAccess', $parameters);
-        self::assertInstanceOf('Countable', $parameters);
-        self::assertInstanceOf('Serializable', $parameters);
-        self::assertInstanceOf('Traversable', $parameters);
+        self::assertInstanceOf(ArrayObject::class, $parameters);
+        self::assertInstanceOf(ArrayAccess::class, $parameters);
+        self::assertInstanceOf(Countable::class, $parameters);
+        self::assertInstanceOf(Serializable::class, $parameters);
+        self::assertInstanceOf(Traversable::class, $parameters);
     }
 
     public function testParametersPersistNameAndValues(): void
@@ -45,7 +50,7 @@ class ParametersTest extends TestCase
         self::assertEquals('barf', $parameters->foof);
     }
 
-    public function testParametersOffsetgetReturnsNullIfNonexistentKeyIsProvided(): void
+    public function testParametersOffsetGetReturnsNullIfNonexistentKeyIsProvided(): void
     {
         $parameters = new Parameters();
         self::assertNull($parameters->foo);
diff --git a/test/PriorityListTest.php b/test/PriorityListTest.php
index 4484c36919f97bd278d04749139cddfd125e7bbc..1a15a9c9da7b90f378cf7455c493d7c680eba040 100644
--- a/test/PriorityListTest.php
+++ b/test/PriorityListTest.php
@@ -10,12 +10,11 @@ use PHPUnit\Framework\TestCase;
 use stdClass;
 
 use function array_keys;
-use function count;
 use function iterator_to_array;
 
 class PriorityListTest extends TestCase
 {
-    /** @var PriorityList */
+    /** @var PriorityList<string, mixed> */
     protected $list;
 
     protected function setUp(): void
@@ -27,7 +26,7 @@ class PriorityListTest extends TestCase
     {
         $this->list->insert('foo', new stdClass(), 0);
 
-        self::assertEquals(1, count($this->list));
+        self::assertCount(1, $this->list);
 
         $values = $this->list->toArray();
         self::assertArrayHasKey('foo', $values);
@@ -38,17 +37,17 @@ class PriorityListTest extends TestCase
         $this->list->insert('foo', new stdClass());
         $this->list->insert('bar', new stdClass());
 
-        self::assertEquals(2, count($this->list));
+        self::assertCount(2, $this->list);
 
         $this->list->insert('foo', new stdClass());
         $this->list->insert('foo', new stdClass());
         $this->list->insert('bar', new stdClass());
 
-        self::assertEquals(2, count($this->list));
+        self::assertCount(2, $this->list);
 
         $this->list->remove('foo');
 
-        self::assertEquals(1, count($this->list));
+        self::assertCount(1, $this->list);
     }
 
     public function testRemove(): void
@@ -56,18 +55,18 @@ class PriorityListTest extends TestCase
         $this->list->insert('foo', new stdClass(), 0);
         $this->list->insert('bar', new stdClass(), 0);
 
-        self::assertEquals(2, count($this->list));
+        self::assertCount(2, $this->list);
 
         $this->list->remove('foo');
 
-        self::assertEquals(1, count($this->list));
+        self::assertCount(1, $this->list);
     }
 
     public function testRemovingNonExistentRouteDoesNotYieldError(): void
     {
         $this->list->remove('foo');
 
-        self::assertEmpty($this->list);
+        self::assertEmpty($this->list->toArray());
     }
 
     public function testClear(): void
@@ -75,11 +74,11 @@ class PriorityListTest extends TestCase
         $this->list->insert('foo', new stdClass(), 0);
         $this->list->insert('bar', new stdClass(), 0);
 
-        self::assertEquals(2, count($this->list));
+        self::assertCount(2, $this->list);
 
         $this->list->clear();
 
-        self::assertEquals(0, count($this->list));
+        self::assertCount(0, $this->list);
         self::assertSame(false, $this->list->current());
     }
 
@@ -156,7 +155,7 @@ class PriorityListTest extends TestCase
 
     public function testPriorityWithNegativesAndNull(): void
     {
-        $this->list->insert('foo', new stdClass(), null);
+        $this->list->insert('foo', new stdClass());
         $this->list->insert('bar', new stdClass(), 1);
         $this->list->insert('baz', new stdClass(), -1);
 
@@ -167,7 +166,7 @@ class PriorityListTest extends TestCase
 
     public function testCurrent(): void
     {
-        $this->list->insert('foo', 'foo_value', null);
+        $this->list->insert('foo', 'foo_value');
         $this->list->insert('bar', 'bar_value', 1);
         $this->list->insert('baz', 'baz_value', -1);
 
@@ -187,7 +186,7 @@ class PriorityListTest extends TestCase
 
     public function testToArray(): void
     {
-        $this->list->insert('foo', 'foo_value', null);
+        $this->list->insert('foo', 'foo_value');
         $this->list->insert('bar', 'bar_value', 1);
         $this->list->insert('baz', 'baz_value', -1);
 
@@ -210,12 +209,13 @@ class PriorityListTest extends TestCase
         );
     }
 
+    /** @psalm-suppress MixedAssignment */
     #[Group('6768')]
     #[Group('6773')]
     public function testBooleanValuesAreValid(): void
     {
-        $this->list->insert('null', null, null);
-        $this->list->insert('false', false, null);
+        $this->list->insert('null', null);
+        $this->list->insert('false', false);
         $this->list->insert('string', 'test', 1);
         $this->list->insert('true', true, -1);
 
diff --git a/test/PriorityQueueTest.php b/test/PriorityQueueTest.php
index 2ea04bcf57583f1d03a88bb17388be7013f9ec0d..bae343f95386561a44998d12bc2ea68c929293bb 100644
--- a/test/PriorityQueueTest.php
+++ b/test/PriorityQueueTest.php
@@ -19,11 +19,12 @@ use function var_export;
 #[Group('Laminas_Stdlib')]
 class PriorityQueueTest extends TestCase
 {
-    /** @var PriorityQueue */
-    protected $queue;
+    /** @var PriorityQueue<string, int> */
+    private PriorityQueue $queue;
 
     protected function setUp(): void
     {
+        /** @psalm-var PriorityQueue<string, int> $this->queue */
         $this->queue = new PriorityQueue();
         $this->queue->insert('foo', 3);
         $this->queue->insert('bar', 4);
@@ -35,7 +36,8 @@ class PriorityQueueTest extends TestCase
     {
         $s            = serialize($this->queue);
         $unserialized = unserialize($s);
-        $count        = count($this->queue);
+        self::assertInstanceOf(PriorityQueue::class, $unserialized);
+        $count = count($this->queue);
         self::assertSame(
             $count,
             count($unserialized),
diff --git a/test/SplQueueTest.php b/test/SplQueueTest.php
index 02cc1970e5aa736ad1e7ecbea55c4c6cc0a2b1c0..1e1d0f9cc591172fe4973b5683f001fa904bb2b7 100644
--- a/test/SplQueueTest.php
+++ b/test/SplQueueTest.php
@@ -31,8 +31,8 @@ class SplQueueTest extends TestCase
     {
         $s            = serialize($this->queue);
         $unserialized = unserialize($s);
-        $count        = count($this->queue);
-        self::assertSame($count, count($unserialized));
+        self::assertInstanceOf(SplQueue::class, $unserialized);
+        self::assertSame(count($this->queue), count($unserialized));
 
         $expected = iterator_to_array($this->queue);
         $test     = iterator_to_array($unserialized);
diff --git a/test/SplStackTest.php b/test/SplStackTest.php
index c44f392342e8db66cde5d845b1f859b86b32ea45..9ac0b1f88e3a244b2caa57dbeb6ded32166a88d9 100644
--- a/test/SplStackTest.php
+++ b/test/SplStackTest.php
@@ -33,8 +33,8 @@ class SplStackTest extends TestCase
     {
         $s            = serialize($this->stack);
         $unserialized = unserialize($s);
-        $count        = count($this->stack);
-        self::assertSame($count, count($unserialized));
+        self::assertInstanceOf(SplStack::class, $unserialized);
+        self::assertSame(count($this->stack), count($unserialized));
 
         $expected = iterator_to_array($this->stack);
         $test     = iterator_to_array($unserialized);
diff --git a/test/StringUtilsTest.php b/test/StringUtilsTest.php
index 3ccad892d7c418097417fc0937825a957d034ce5..f832a73cd54bcbdb33b2b671875d16bd28bbe891 100644
--- a/test/StringUtilsTest.php
+++ b/test/StringUtilsTest.php
@@ -154,12 +154,10 @@ class StringUtilsTest extends TestCase
         ];
     }
 
-    /**
-     * @param bool $valid
-     */
     #[DataProvider('getUtf8StringValidity')]
-    public function testIsValidUtf8(mixed $str, $valid): void
+    public function testIsValidUtf8(mixed $str, bool $valid): void
     {
+        /** @psalm-suppress MixedArgument */
         self::assertSame($valid, StringUtils::isValidUtf8($str));
     }
 
diff --git a/test/StringWrapper/CommonStringWrapperTestCase.php b/test/StringWrapper/CommonStringWrapperTestCase.php
index 9e4104b214f8b9796a35aac048c7b841e3b6b53b..acb171cd63e4f2d762241021a544126e93d0172e 100644
--- a/test/StringWrapper/CommonStringWrapperTestCase.php
+++ b/test/StringWrapper/CommonStringWrapperTestCase.php
@@ -17,12 +17,10 @@ use const STR_PAD_RIGHT;
 // phpcs:ignore WebimpressCodingStandard.NamingConventions.AbstractClass.Prefix
 abstract class CommonStringWrapperTestCase extends TestCase
 {
-    /**
-     * @param null|string $encoding
-     * @param null|string $convertEncoding
-     * @return false|StringWrapperInterface
-     */
-    abstract protected function getWrapper($encoding = null, $convertEncoding = null);
+    abstract protected function getWrapper(
+        string|null $encoding = null,
+        string|null $convertEncoding = null,
+    ): StringWrapperInterface|false;
 
     /**
      * @psalm-return array<array-key, array{
diff --git a/test/StringWrapper/IconvTest.php b/test/StringWrapper/IconvTest.php
index 494f64dafe55bc10b51f98f4eed5cd8f5c01394f..1081eaa510e0674ff5f786b3febd22db18237c2f 100644
--- a/test/StringWrapper/IconvTest.php
+++ b/test/StringWrapper/IconvTest.php
@@ -6,7 +6,6 @@ namespace LaminasTest\Stdlib\StringWrapper;
 
 use Laminas\Stdlib\Exception;
 use Laminas\Stdlib\StringWrapper\Iconv;
-use Laminas\Stdlib\StringWrapper\StringWrapperInterface;
 
 use function array_shift;
 use function extension_loaded;
@@ -21,7 +20,7 @@ class IconvTest extends CommonStringWrapperTestCase
     {
         if (! extension_loaded('iconv')) {
             try {
-                new Iconv('utf-8');
+                new Iconv();
                 $this->fail('Missing expected Laminas\Stdlib\Exception\ExtensionNotLoadedException');
             } catch (Exception\ExtensionNotLoadedException) {
                 $this->markTestSkipped('Missing ext/iconv');
@@ -45,13 +44,10 @@ class IconvTest extends CommonStringWrapperTestCase
         parent::setUp();
     }
 
-    /**
-     * @param null|string $encoding
-     * @param null|string $convertEncoding
-     * @return false|StringWrapperInterface
-     */
-    protected function getWrapper($encoding = null, $convertEncoding = null)
-    {
+    protected function getWrapper(
+        string|null $encoding = null,
+        string|null $convertEncoding = null,
+    ): Iconv|false {
         if ($encoding === null) {
             $supportedEncodings = Iconv::getSupportedEncodings();
             $encoding           = array_shift($supportedEncodings);
diff --git a/test/StringWrapper/IntlTest.php b/test/StringWrapper/IntlTest.php
index f6dbc2910b12ec47324c2a4da44d80382bb4db2e..94fef23d4e527f628f1f2763ffe20a62e38e9d1d 100644
--- a/test/StringWrapper/IntlTest.php
+++ b/test/StringWrapper/IntlTest.php
@@ -16,7 +16,7 @@ class IntlTest extends CommonStringWrapperTestCase
     {
         if (! extension_loaded('intl')) {
             try {
-                new Intl('utf-8');
+                new Intl();
                 $this->fail('Missing expected Laminas\Stdlib\Exception\ExtensionNotLoadedException');
             } catch (Exception\ExtensionNotLoadedException) {
                 $this->markTestSkipped('Missing ext/intl');
@@ -26,13 +26,10 @@ class IntlTest extends CommonStringWrapperTestCase
         parent::setUp();
     }
 
-    /**
-     * @param null|string $encoding
-     * @param null|string $convertEncoding
-     * @return Intl|false
-     */
-    protected function getWrapper($encoding = null, $convertEncoding = null)
-    {
+    protected function getWrapper(
+        string|null $encoding = null,
+        string|null $convertEncoding = null,
+    ): Intl|false {
         if ($encoding === null) {
             $supportedEncodings = Intl::getSupportedEncodings();
             $encoding           = array_shift($supportedEncodings);
diff --git a/test/StringWrapper/MbStringTest.php b/test/StringWrapper/MbStringTest.php
index 6d0ee2f0cb28d4ea807c5fc4253606a7a61e813a..e0535168a100571ec7d4b291db17ec1497b28ee5 100644
--- a/test/StringWrapper/MbStringTest.php
+++ b/test/StringWrapper/MbStringTest.php
@@ -16,7 +16,7 @@ class MbStringTest extends CommonStringWrapperTestCase
     {
         if (! extension_loaded('mbstring')) {
             try {
-                new MbString('utf-8');
+                new MbString();
                 $this->fail('Missing expected Laminas\Stdlib\Exception\ExtensionNotLoadedException');
             } catch (Exception\ExtensionNotLoadedException) {
                 $this->markTestSkipped('Missing ext/mbstring');
@@ -26,13 +26,10 @@ class MbStringTest extends CommonStringWrapperTestCase
         parent::setUp();
     }
 
-    /**
-     * @param null|string $encoding
-     * @param null|string $convertEncoding
-     * @return MbString|false
-     */
-    protected function getWrapper($encoding = null, $convertEncoding = null)
-    {
+    protected function getWrapper(
+        string|null $encoding = null,
+        string|null $convertEncoding = null,
+    ): MbString|false {
         if ($encoding === null) {
             $supportedEncodings = MbString::getSupportedEncodings();
             $encoding           = array_shift($supportedEncodings);
diff --git a/test/StringWrapper/NativeTest.php b/test/StringWrapper/NativeTest.php
index b554a1c8c6ff8483e99f962b6a46c0fce195b221..1c718f67ff70d7cc5096e66a1c4d65e2bc521c27 100644
--- a/test/StringWrapper/NativeTest.php
+++ b/test/StringWrapper/NativeTest.php
@@ -10,13 +10,10 @@ use function array_shift;
 
 class NativeTest extends CommonStringWrapperTestCase
 {
-    /**
-     * @param null|string $encoding
-     * @param null|string $convertEncoding
-     * @return Native|false
-     */
-    protected function getWrapper($encoding = null, $convertEncoding = null)
-    {
+    protected function getWrapper(
+        string|null $encoding = null,
+        string|null $convertEncoding = null,
+    ): Native|false {
         if ($encoding === null) {
             $supportedEncodings = Native::getSupportedEncodings();
             $encoding           = array_shift($supportedEncodings);
diff --git a/test/TestAsset/TestOptions.php b/test/TestAsset/TestOptions.php
index 660a64d76ad0140b462d570e4c7cafe4068bab65..7ffa0284f310d7ba056948aeb1e07e2623bf08d8 100644
--- a/test/TestAsset/TestOptions.php
+++ b/test/TestAsset/TestOptions.php
@@ -8,28 +8,25 @@ use Laminas\Stdlib\AbstractOptions;
 
 /**
  * Dummy TestOptions used to test Stdlib\Options
+ *
+ * @extends AbstractOptions<mixed>
  */
 class TestOptions extends AbstractOptions
 {
-    /** @var mixed */
-    protected $testField;
+    protected mixed $testField;
 
-    /** @var mixed */
-    private $parentPrivate;
+    private mixed $parentPrivate;
 
-    /** @var mixed */
-    protected $parentProtected;
+    protected mixed $parentProtected;
 
-    /** @var mixed */
-    protected $parentPublic;
+    protected mixed $parentPublic;
 
     public function setTestField(mixed $value): void
     {
         $this->testField = $value;
     }
 
-    /** @return mixed */
-    public function getTestField()
+    public function getTestField(): mixed
     {
         return $this->testField;
     }
@@ -44,10 +41,8 @@ class TestOptions extends AbstractOptions
 
     /**
      * Needed to test accessibility of getters / setters within deriving classes
-     *
-     * @return mixed
      */
-    private function getParentPrivate()
+    private function getParentPrivate(): mixed
     {
         return $this->parentPrivate;
     }
@@ -62,10 +57,8 @@ class TestOptions extends AbstractOptions
 
     /**
      * Needed to test accessibility of getters / setters within deriving classes
-     *
-     * @return mixed
      */
-    protected function getParentProtected()
+    protected function getParentProtected(): mixed
     {
         return $this->parentProtected;
     }
@@ -80,10 +73,8 @@ class TestOptions extends AbstractOptions
 
     /**
      * Needed to test accessibility of getters / setters within deriving classes
-     *
-     * @return mixed
      */
-    public function getParentPublic()
+    public function getParentPublic(): mixed
     {
         return $this->parentPublic;
     }
diff --git a/test/TestAsset/TestOptionsDerived.php b/test/TestAsset/TestOptionsDerived.php
index 54215d22fe7a2a33fe966e8c7ab7f67825640fad..a8620ca2dd518c7742852f434633996601c12f70 100644
--- a/test/TestAsset/TestOptionsDerived.php
+++ b/test/TestAsset/TestOptionsDerived.php
@@ -9,14 +9,11 @@ namespace LaminasTest\Stdlib\TestAsset;
  */
 class TestOptionsDerived extends TestOptions
 {
-    /** @var mixed */
-    private $derivedPrivate;
+    private mixed $derivedPrivate;
 
-    /** @var mixed */
-    protected $derivedProtected;
+    protected mixed $derivedProtected;
 
-    /** @var mixed */
-    protected $derivedPublic;
+    protected mixed $derivedPublic;
 
     /**
      * Needed to test accessibility of getters / setters within deriving classes
@@ -28,10 +25,8 @@ class TestOptionsDerived extends TestOptions
 
     /**
      * Needed to test accessibility of getters / setters within deriving classes
-     *
-     * @return mixed
      */
-    private function getDerivedPrivate()
+    private function getDerivedPrivate(): mixed
     {
         return $this->derivedPrivate;
     }
@@ -46,10 +41,8 @@ class TestOptionsDerived extends TestOptions
 
     /**
      * Needed to test accessibility of getters / setters within deriving classes
-     *
-     * @return mixed
      */
-    protected function getDerivedProtected()
+    protected function getDerivedProtected(): mixed
     {
         return $this->derivedProtected;
     }
@@ -64,10 +57,8 @@ class TestOptionsDerived extends TestOptions
 
     /**
      * Needed to test accessibility of getters / setters within deriving classes
-     *
-     * @return mixed
      */
-    public function getDerivedPublic()
+    public function getDerivedPublic(): mixed
     {
         return $this->derivedPublic;
     }
diff --git a/test/TestAsset/TestOptionsNoStrict.php b/test/TestAsset/TestOptionsNoStrict.php
index 039d1095f6f7acafecfcfb7d15eb0a36262517d9..3e29705d0095d39a7b7315e54588c72fc2015ade 100644
--- a/test/TestAsset/TestOptionsNoStrict.php
+++ b/test/TestAsset/TestOptionsNoStrict.php
@@ -8,6 +8,8 @@ use Laminas\Stdlib\AbstractOptions;
 
 /**
  * Dummy TestOptions used to test Stdlib\Options
+ *
+ * @extends AbstractOptions<mixed>
  */
 class TestOptionsNoStrict extends AbstractOptions
 {
@@ -18,16 +20,14 @@ class TestOptionsNoStrict extends AbstractOptions
 
     // phpcs:enable
 
-    /** @var mixed */
-    protected $testField;
+    protected mixed $testField;
 
     public function setTestField(mixed $value): void
     {
         $this->testField = $value;
     }
 
-    /** @return mixed */
-    public function getTestField()
+    public function getTestField(): mixed
     {
         return $this->testField;
     }
diff --git a/test/TestAsset/TestOptionsWithoutGetter.php b/test/TestAsset/TestOptionsWithoutGetter.php
index e0cfd5aa7a6533d06ffd801989d9e0c50016de24..08824e90e293a4dd748a7baf9458dadf64a5c1b8 100644
--- a/test/TestAsset/TestOptionsWithoutGetter.php
+++ b/test/TestAsset/TestOptionsWithoutGetter.php
@@ -8,11 +8,12 @@ use Laminas\Stdlib\AbstractOptions;
 
 /**
  * Dummy TestOptions used to test Stdlib\Options
+ *
+ * @extends AbstractOptions<mixed>
  */
 class TestOptionsWithoutGetter extends AbstractOptions
 {
-    /** @var mixed */
-    protected $foo;
+    protected mixed $foo;
 
     public function setFoo(mixed $value): void
     {