1<!doctype html> 2<html lang="en" class="scroll-smooth scroll-pt-20"> 3<head> 4 <meta charset="utf-8"> 5 <meta name='viewport' content='width=device-width, initial-scale=1'> 6 <title>Playground | PHPStan</title> 7 8 9 <meta property="og:title" content="Playground" /> 10 11 12 <meta property="og:image" content="/assets/logo-big-CbtT9iBK.png" /> 13 <meta name="twitter:image" content="/assets/logo-big-CbtT9iBK.png" /> 14 15 16 <link rel="icon" type="image/png" href="/assets/favicon-DrgKtcYh.png"> 17 <link rel="alternate" type="application/rss+xml" title="PHPStan Blog" href="/assets/rss-Chs5255d.xml"> 18 19 <meta name="twitter:card" content="summary_large_image" /> 20 <meta name="twitter:site" content="@phpstan" /> 21 <meta name="twitter:creator" content="@ondrejmirtes" /> 22 <meta name="twitter:title" content="Playground" /> 23
23<script src="https://cdn.usefathom.com/script.js" data-site="UDESFNRN" defer></script>
23 24
24<script> 25 const query = window.matchMedia('(prefers-color-scheme: dark)'); 26 const themeKey = 'phpstanWebTheme'; 27 query.addEventListener('change', (event) => { 28 if (themeKey in localStorage) { 29 return; 30 } 31 if (event.matches) { 32 document.documentElement.classList.add('dark'); 33 } else { 34 document.documentElement.classList.remove('dark'); 35 } 36 }); 37 if (localStorage[themeKey] === 'dark' || (!(themeKey in localStorage) && query.matches)) { 38 document.documentElement.classList.add('dark'); 39 } else { 40 document.documentElement.classList.remove('dark'); 41 } 42 </script>
42 43
43<script type="module" crossorigin src="/assets/try-CwsuzZ_f.js"></script>
43 44 <link rel="modulepreload" crossorigin href="/assets/index-CXX-MkTh.js"> 45 <link rel="modulepreload" crossorigin href="/assets/MainMenuViewModel-opvoTkRu.js"> 46 <link rel="modulepreload" crossorigin href="/assets/prism-COPrkmZW.js"> 47 <link rel="stylesheet" crossorigin href="/assets/index-CNf8kz9l.css"> 48 <link rel="stylesheet" crossorigin href="/assets/MainMenuViewModel-DmyQxVw1.css"> 49</head> 50<body> 51 52<div class="flex flex-col main-area" style="background-color: #fff"> 53 <nav class="bg-white border-b border-gray-200 flex-shrink z-20 nav-header"> 54 <!-- ko with: mainMenu --> 55 <div class="max-w-5xl mx-auto px-4 md:px-6"> 56 <div class="flex justify-between h-16"> 57 <div class="flex flex-grow"> 58 <div class="w-64 flex flex-none items-center"> 59 <a href="/"><img class="block h-12 w-auto rounded-lg" src="/assets/logo-D3DIJ-HJ.png" alt="PHPStan" /></a> 60 <a href="/" class="ml-4"><svg xmlns="http://www.w3.org/2000/svg" class="h-6" viewBox="0 0 275 46" fill="none"> 61 <g clip-path="url(#clip0)"> 62 <path d="M36.86 16.24C36.86 24.61 31.36 31.05 21.24 31.05H13.12V40.67C13.12 43.1 11.81 44.42 9.37 44.42H3.75C1.31 44.42 0 43.1 0 40.67V4.44C0 2 1.31 0.690002 3.75 0.690002H21.24C31.42 0.690002 36.86 7.87 36.86 16.24ZM23.74 16.37C23.74 14.06 22.11 11.93 19.87 11.93H13.12V20.62H19.87C20.9389 20.5481 21.9386 20.0656 22.6599 19.2735C23.3812 18.4813 23.7682 17.441 23.74 16.37V16.37Z" fill="#231F20"/> 63 <path d="M41.79 40.67V4.44C41.79 2 43.11 0.690002 45.54 0.690002H51.17C53.6 0.690002 54.91 2 54.91 4.44V18.12H67.72V4.44C67.72 2 69 0.690002 71.47 0.690002H77.09C79.53 0.690002 80.84 2 80.84 4.44V40.67C80.84 43.1 79.53 44.42 77.09 44.42H71.47C69.03 44.42 67.72 43.1 67.72 40.67V28.8H54.91V40.67C54.91 43.1 53.6 44.42 51.17 44.42H45.54C43.11 44.42 41.79 43.1 41.79 40.67Z" fill="#231F20"/> 64 <path d="M125.32 16.24C125.32 24.61 119.82 31.05 109.7 31.05H101.58V40.67C101.58 43.1 100.27 44.42 97.83 44.42H92.21C89.78 44.42 88.46 43.1 88.46 40.67V4.44C88.46 2 89.78 0.690002 92.21 0.690002H109.7C119.89 0.690002 125.32 7.87 125.32 16.24ZM112.2 16.37C112.2 14.06 110.58 11.93 108.33 11.93H101.58V20.62H108.33C109.4 20.5505 110.401 20.0688 111.123 19.2761C111.845 18.4834 112.231 17.4416 112.2 16.37V16.37Z" fill="#231F20"/> 65 <path d="M128.51 35.11C127.64 32.73 128.89 31.11 131.26 30.55L134.82 29.74C137.01 29.24 138.13 30.17 139.44 32.17C140.75 34.17 142.88 35.11 145.88 35.11C148.88 35.11 151 34.11 151 32C151 30.94 150.44 29.57 147.31 28.57L142.38 26.69C140.26 26.01 129.63 23.2 129.51 13.89C129.51 5.43 136.63 0 146.19 0C152.94 0 157.68 2.69 160.5 7.68C161.81 9.93 160.75 11.81 158.31 12.49L154.94 13.43C152.81 14.06 151.62 13.18 150.06 11.43C149.597 10.9432 149.033 10.5631 148.408 10.3161C147.782 10.0692 147.111 9.96131 146.44 10C144.32 10 142.32 10.87 142.32 12.74C142.32 13.99 143.19 15.12 145.88 16.05L150.75 17.74C160.5 21.12 163.56 25.36 163.75 31.55C163.75 40.86 155.38 45.1 145.89 45.1C137.26 45.1 131 41.54 128.51 35.11Z" fill="#231F20"/> 66 <path d="M170.56 33.05V20.87H167.93C167.678 20.8949 167.424 20.8636 167.186 20.7785C166.948 20.6933 166.731 20.5563 166.553 20.3775C166.374 20.1986 166.237 19.9822 166.152 19.7441C166.066 19.5059 166.035 19.2517 166.06 19V13.43C166.035 13.1783 166.066 12.9241 166.152 12.6859C166.237 12.4477 166.374 12.2314 166.553 12.0525C166.731 11.8737 166.948 11.7367 167.186 11.6515C167.424 11.5664 167.678 11.5351 167.93 11.56H171.93L173 5.75C173.068 5.08776 173.396 4.47943 173.911 4.05786C174.426 3.63628 175.087 3.43573 175.75 3.5H180.63C180.967 3.46111 181.308 3.49919 181.628 3.61139C181.948 3.72358 182.238 3.90695 182.477 4.14767C182.716 4.38839 182.897 4.68019 183.007 5.00105C183.116 5.32192 183.152 5.66348 183.11 6V11.56H189.05C189.302 11.5351 189.556 11.5664 189.794 11.6515C190.032 11.7367 190.249 11.8737 190.427 12.0525C190.606 12.2314 190.743 12.4477 190.828 12.6859C190.914 12.9241 190.945 13.1783 190.92 13.43V19C190.946 19.2525 190.916 19.5078 190.832 19.7472C190.747 19.9867 190.611 20.2043 190.432 20.3843C190.253 20.5643 190.036 20.7022 189.797 20.788C189.558 20.8737 189.303 20.9051 189.05 20.88H183.11V33.18C183.11 34.62 183.8 35.18 184.68 35.18C185.99 35.18 186.42 33.87 186.42 32.68C186.432 32.3455 186.412 32.0107 186.36 31.68C186.24 30.37 186.67 29.68 187.92 29.68H192.55C193.008 29.6305 193.47 29.7408 193.856 29.9923C194.242 30.2437 194.53 30.6209 194.67 31.06C194.963 31.8838 195.131 32.7466 195.17 33.62C195.17 42.8 188.67 45.11 183.05 45.11C177.18 45.1 170.56 42.67 170.56 33.05Z" fill="#231F20"/> 67 <path d="M197 28C197 18.06 203.69 10.88 212.43 10.88C216.68 10.88 220.06 12.69 221.81 15.69V15.32C221.81 12.88 223.12 11.57 225.55 11.57H230.92C233.36 11.57 234.67 12.88 234.67 15.32V40.67C234.67 43.1 233.36 44.42 230.92 44.42H225.55C223.12 44.42 221.81 43.1 221.81 40.67V40.36C220.06 43.29 216.68 45.1 212.43 45.1C203.67 45.1 197 37.92 197 28ZM222 28C222 23.87 219.69 20.69 215.94 20.69C212.19 20.69 209.88 23.87 209.88 28C209.88 32.13 212.19 35.31 215.94 35.31C219.69 35.31 222 32.11 222 28Z" fill="#231F20"/> 68 <path d="M240.78 40.67V15.31C240.78 12.87 242.09 11.56 244.53 11.56H249.9
68C252.34 11.56 253.65 12.87 253.65 15.31V15.62C255.46 12.68 258.33 10.87 262.77 10.87C272.95 10.87 274.2 19.8 274.2 25.18V40.67C274.2 43.1 272.89 44.42 270.45 44.42H265.08C262.64 44.42 261.33 43.1 261.33 40.67V26.42C261.33 23.86 260.77 20.87 257.46 20.87C254.15 20.87 253.65 23.87 253.65 26.42V40.67C253.65 43.1 252.34 44.42 249.9 44.42H244.53C242.09 44.42 240.78 43.1 240.78 40.67Z" fill="#231F20"/> 69 </g> 70 <defs> 71 <clipPath id="clip0"> 72 <rect width="275" height="46" fill="white"/> 73 </clipPath> 74 </defs> 75 </svg></a> 76 </div> 77 <div class="flex flex-grow justify-between"> 78 <div class="hidden md:-my-px md:flex px-4 flex-grow"> 79 <div class="flex flex-shrink md:-my-px"> 80 81 82 <a href="/" class="mr-8 inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-md font-medium leading-5 text-gray-500 hover:text-gray-700 hover:border-gray-300 focus:outline-none focus:text-gray-700 focus:border-gray-300 transition duration-150 ease-in-out"> 83 <span>Home</span> 84 </a> 85 86 87 88 <a href="/try" class="mr-8 inline-flex items-center px-1 pt-1 border-b-2 border-blue-500 text-md font-medium leading-5 text-gray-900 focus:outline-none focus:border-blue-700 transition duration-150 ease-in-out"> 89 <span>Try</span> 90 </a> 91 92 93 94 <a href="/documentation" class="mr-8 inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-md font-medium leading-5 text-gray-500 hover:text-gray-700 hover:border-gray-300 focus:outline-none focus:text-gray-700 focus:border-gray-300 transition duration-150 ease-in-out"> 95 <span>Documentation</span> 96 </a> 97 98 99 100 <a href="/blog" class="mr-8 inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-md font-medium leading-5 text-gray-500 hover:text-gray-700 hover:border-gray-300 focus:outline-none focus:text-gray-700 focus:border-gray-300 transition duration-150 ease-in-out"> 101 <span>Blog</span> 102 </a> 103 104 105 </div> 106 107 <div class="items-center flex flex-grow justify-end"> 108 <div id="docsearch"></div> 109 <a target="_blank" href="https://github.com/phpstan/phpstan" class="ml-4 px-1 pt-1 border-b-2 border-transparent text-md font-medium leading-5 text-gray-500 hover:text-gray-700 focus:outline-none focus:text-gray-700 transition duration-150 ease-in-out"> 110 <svg class="h-6 w-6" fill="currentColor" viewBox="0 0 24 24"> 111 <path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd"/> 112 </svg> 113 </a> 114 </div> 115 </div> 116 </div> 117 </div> 118 <div class="-mr-2 flex items-center md:hidden"> 119 <div id="docsearch-mobile"></div> 120 <button data-bind="click: toggleMainMenu" class="ml-2 inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 focus:text-gray-500 transition duration-150 ease-in-out"> 121 <svg class="h-6 w-6" stroke="currentColor" fill="none" viewBox="0 0 24 24"> 122 <path data-bind="css: {hidden: mainMenuOpen, 'inline-flex': !mainMenuOpen()}" class="inline-flex" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" /> 123 <path data-bind="css: {hidden: !mainMenuOpen(), 'inline-flex': mainMenuOpen}" class="hidden" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" /> 124 </svg> 125 </button> 126 </div>
127 </div> 128 </div> 129 <div data-bind="css: {block: mainMenuOpen, hidden: !mainMenuOpen()}" class="hidden md:hidden"> 130 <div class="pt-2 pb-3"> 131 132 133 <a href="/" class="mt-1 block pl-3 pr-4 py-2 border-l-4 border-transparent text-base font-medium text-gray-600 hover:text-gray-800 hover:bg-gray-50 hover:border-gray-300 focus:outline-none focus:text-gray-800 focus:bg-gray-50 focus:border-gray-300 transition duration-150 ease-in-out"> 134 Home 135 </a> 136 137 138 139 <a href="/try" class="algolia-active mt-1 block pl-3 pr-4 py-2 border-l-4 border-blue-500 text-base font-medium text-blue-700 bg-blue-50 focus:outline-none focus:text-blue-800 focus:bg-blue-100 focus:border-blue-700 transition duration-150 ease-in-out"> 140 Try 141 </a> 142 143 144 145 <a href="/documentation" class="mt-1 block pl-3 pr-4 py-2 border-l-4 border-transparent text-base font-medium text-gray-600 hover:text-gray-800 hover:bg-gray-50 hover:border-gray-300 focus:outline-none focus:text-gray-800 focus:bg-gray-50 focus:border-gray-300 transition duration-150 ease-in-out"> 146 Documentation 147 </a> 148 149 150 151 <a href="/blog" class="mt-1 block pl-3 pr-4 py-2 border-l-4 border-transparent text-base font-medium text-gray-600 hover:text-gray-800 hover:bg-gray-50 hover:border-gray-300 focus:outline-none focus:text-gray-800 focus:bg-gray-50 focus:border-gray-300 transition duration-150 ease-in-out"> 152 Blog 153 </a> 154 155 156 157 <a target="_blank" href="https://github.com/phpstan/phpstan" class="flex items-center mt-1 block pl-3 pr-4 py-2 border-l-4 border-transparent text-base font-medium text-gray-600 hover:text-gray-800 hover:bg-gray-50 hover:border-gray-300 focus:outline-none focus:text-gray-800 focus:bg-gray-50 focus:border-gray-300 transition duration-150 ease-in-out"> 158 <span>GitHub</span> 159 <svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" class="w-4 h-4 ml-1"><path d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"></path></svg> 160 </a> 161 </div> 162 </div> 163 <!-- /ko --> 164 </nav> 165 <div> 166 <main> 167 <div class="max-w-5xl mx-auto md:px-6"> 168 169 170<dialog id="optionsDialog" class="options-dialog rounded-xl shadow-2xl border border-gray-200 dark:border-black p-0 w-[calc(100%-2rem)] max-w-4xl backdrop:bg-black/50" data-bind="click: handleOptionsBackdropClick"> 171 <div class="p-6"> 172 <div class="flex items-center justify-between mb-4"> 173 <div class="flex items-center gap-3"> 174 <h2 class="text-lg font-semibold">Options</h2> 175 <a href="/config-reference" target="_blank" class="inline-flex items-center text-sm text-blue-600 hover:text-blue-800 hover:underline">Config reference<svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" class="w-4 h-4 ml-1"><path d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"></path></svg></a> 176 </div> 177 <button type="button" data-bind="click: cancelOptions" class="text-gray-400 hover:text-gray-600 p-1 cursor-pointer"> 178 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-5 h-5"> 179 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12" /> 180 </svg> 181 </button> 182 </div> 183 184 <div class="mb-5"> 185 <button type="button" data-bind="click: resetOptionsToDefaults, disable: !isNotDefaults()" class="text-sm px-3 py-1.5 rounded-md border border-gray-300 bg-white hover:bg-gray-50 text-gray-700 disabled:bg-gray-50 disabled:text-gray-400 disabled:border-gray-200 disabled:cursor-default cursor-pointer">Reset to defaults</button> 186 </div> 187 188 <div class="flex flex-col md:flex-row md:gap-12"> 189 <fieldset class="md:flex-1 border-t border-gray-200 pt-4 md:border-t-0 md:pt-0"> 190 <legend class="text-sm font-semibold text-gray-500 uppercase tracking-wide mb-3">General</legend> 191 <div class="space-y-3"> 192 <label class="flex items-center gap-2.5 cursor-pointer"> 193 <input type="checkbox" data-bind="checked: strictRules" class="border-gray-300 rounded dark:border-current"> 194 <span class="flex items-center gap-1.5" data-bind="css: { 'text-blue-600': isNonDefault('strictRules') }">Strict rules<a href="/config-reference#stricter-analysis" target="_blank" class="text-gray-400 hover:text-gray-600" onclick="event.stopPropagation()"><svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" class="w-3.5 h-3.5"><path d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"></path></svg></a></span> 195 </label> 196 <label class="flex items-center gap-2.5 cursor-pointer"> 197 <input type="checkbox" data-bind="checked: bleedingEdge" class="border-gray-300 rounded dark:border-current"> 198 <span class="flex items-center gap-1.5" data-bind="css: { 'text-blue-600': isNonDefault('bleedingEdge') }">Bleeding edge<a href="/config-reference#bleeding-edge" target="_blank" class="text-gray-400 hover:text-gray-600" onclick="event.stopPropagation()"><svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" class="w-3.5 h-3.5"><path d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"></path></svg></a></span> 199 </label> 200 <label class="flex items-center gap-2.5 cursor-pointer"> 201 <input type="checkbox" data-bind="checked: treatPhpDocTypesAsCertain" class="border-gray-300 rounded dark:border-current"> 202 <span class="flex items-center gap-1.5" data-bind="css: { 'text-blue-600': isNonDefault('treatPhpDocTypesAsCertain') }">Treat PHPDoc types as certain<a href="/config-reference#treatphpdoctypesascertain" target="_blank" class="text-gray-400 hover:text-gray-600" onclick="event.stopPropagation()"><svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" class="w-3.5 h-3.5"><path d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"></path></svg></a></span> 203 </label> 204 <label class="flex items-center gap-2.5 cursor-pointer"> 205 <input type="checkbox" data-bind="checked: inferPrivatePropertyTypeFromConstructor" class="border-gray-300 rounded dark:border-current"> 206 <span class="flex items-center gap-1.5" data-bind="css: { 'text-blue-600': isNonDefault('inferPrivatePropertyTypeFromConstructor') }">Infer private property type from constructor<a href="/config-reference#inferprivatepropertytypefromconstructor" target="_blank" class="text-gray-400 hover:text-gray-600" onclick="event.stopPropagation()"><svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" class="w-3.5 h-3.5"><path d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"></path></svg></a></span> 207 </label> 208 <label class="flex items-center gap-2.5 cursor-pointer"> 209 <input type="checkbox" data-bind="checked: rememberPossiblyImpureFunctionValues" class="border-gray-300 rounded dark:border-current"> 210 <span class="flex items-center gap-1.5" data-bind="css: { 'text-blue-600': isNonDefault('rememberPossiblyImpureFunctionValues') }">Remember possibly impure function values<a href="/config-reference#rememberpossiblyimpurefunctionvalues" target="_blank" class="text-gray-400 hover:text-gray-600" onclick="event.stopPropagation()"><svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" class="w-3.5 h-3.5"><path d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"></path></svg></a></span> 211 </label> 212 <label class="flex items-center gap-2.5 cursor-pointer"> 213 <input type="checkbox" data-bind="checked: checkBenevolentUnionTypes" class="border-gray-300 rounded dark:border-current"> 214 <span class="flex items-center gap-1.5" data-bind="css: { 'text-blue-600': isNonDefault('checkBenevolentUnionTypes') }">Check benevolent union types<a href="/config-reference#checkbenevolentuniontypes" target="_blank" class="text-gray-400 hover:text-gray-600" onclick="event.stopPropagation()"><svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" class="w-3.5 h-3.5"><path d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"></path></svg></a></span> 215 </label> 216 <label class="flex items-center gap-2.5 cursor-pointer"> 217 <input type="checkbox" data-bind="checked: checkTooWideTypesInProtectedAndPublicMethods" class="border-gray-300 rounded dark:border-current"> 218 <span class="flex items-center gap-1.5" data-bind="css: { 'text-blue-600': isNonDefault('checkTooWideTypesInProtectedAndPublicMethods') }">Check too wide types in non-private methods<a href="/config-reference#checktoowidereturntypesinprotectedandpublicmethods" target="_blank" class="text-gray-400 hover:text-gray-600" onclick="event.stopPropagation()"><svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" class="w-3.5 h-3.5"><path d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"></path></svg></a></span> 219 </label> 220 <div> 221 <div class="flex items-center gap-1.5 mb-1.5"> 222 <span class="text-sm font-medium" data-bind="css: { 'text-blue-600': isNonDefault('reportUnsafeArrayStringKeyCasting'), 'text-gray-700': !isNonDefault('reportUnsafeArrayStringKeyCasting') }">Array String Keys</span> 223 <a href="/blog/why-array-string-keys-are-not-type-safe" target="_blank" class="text-gray-400 hover:text-gray-600" onclick="event.stopPropagation()"><svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" class="w-3.5 h-3.5"><path d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"></path></svg></a> 224 </div> 225 <div class="flex gap-4 ml-0.5"> 226 <label class="flex items-center gap-1.5 cursor-pointer"> 227 <input type="radio" name="reportUnsafeArrayStringKeyCasting" data-bind="checked: report
227UnsafeArrayStringKeyCasting" value="null" class="border-gray-300 dark:border-current"> 228 <span>Unsafe</span> 229 </label> 230 <label class="flex items-center gap-1.5 cursor-pointer"> 231 <input type="radio" name="reportUnsafeArrayStringKeyCasting" data-bind="checked: reportUnsafeArrayStringKeyCasting" value="detect" class="border-gray-300 dark:border-current"> 232 <span>Detect</span> 233 </label> 234 <label class="flex items-center gap-1.5 cursor-pointer"> 235 <input type="radio" name="reportUnsafeArrayStringKeyCasting" data-bind="checked: reportUnsafeArrayStringKeyCasting" value="prevent" class="border-gray-300 dark:border-current"> 236 <span>Prevent</span> 237 </label> 238 </div> 239 </div> 240 </div> 241 </fieldset> 242 243 <fieldset class="md:flex-1 mt-4 pt-4 border-t border-gray-200 md:mt-0 md:pt-0 md:border-t-0"> 244 <legend class="text-sm font-semibold text-gray-500 uppercase tracking-wide mb-3">Exceptions</legend> 245 <div class="space-y-3"> 246 <label class="flex items-center gap-2.5 cursor-pointer"> 247 <input type="checkbox" data-bind="checked: implicitThrows" class="border-gray-300 rounded dark:border-current"> 248 <span class="flex items-center gap-1.5" data-bind="css: { 'text-blue-600': isNonDefault('implicitThrows') }">Implicit <code class="text-xs px-1 py-0.5 bg-gray-100 rounded font-mono">@throws</code><a href="/config-reference#exceptions.implicitthrows" target="_blank" class="text-gray-400 hover:text-gray-600" onclick="event.stopPropagation()"><svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" class="w-3.5 h-3.5"><path d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"></path></svg></a></span> 249 </label> 250 <label class="flex items-center gap-2.5 cursor-pointer"> 251 <input type="checkbox" data-bind="checked: reportUncheckedExceptionDeadCatch" class="border-gray-300 rounded dark:border-current"> 252 <span class="flex items-center gap-1.5" data-bind="css: { 'text-blue-600': isNonDefault('reportUncheckedExceptionDeadCatch') }">Report unchecked exception dead catch<a href="/config-reference#exceptions.reportuncheckedexceptiondeadcatch" target="_blank" class="text-gray-400 hover:text-gray-600" onclick="event.stopPropagation()"><svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" class="w-3.5 h-3.5"><path d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"></path></svg></a></span> 253 </label> 254 <label class="flex items-center gap-2.5 cursor-pointer"> 255 <input type="checkbox" data-bind="checked: missingCheckedExceptionInThrows" class="border-gray-300 rounded dark:border-current"> 256 <span class="flex items-center gap-1.5" data-bind="css: { 'text-blue-600': isNonDefault('missingCheckedExceptionInThrows') }">Missing checked exception in <code class="text-xs px-1 py-0.5 bg-gray-100 rounded font-mono">@throws</code><a href="/config-reference#exceptions.check.missingcheckedexceptioninthrows" target="_blank" class="text-gray-400 hover:text-gray-600" onclick="event.stopPropagation()"><svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" class="w-3.5 h-3.5"><path d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"></path></svg></a></span> 257 </label> 258 259 <!-- Note: show only when missingCheckedExceptionInThrows or reportUncheckedExceptionDeadCatch are on --> 260 <div> 261 <label for="uncheckedExceptionClasses" class="block text-sm font-medium mb-1" data-bind="css: { 'text-blue-600': isNonDefault('uncheckedExceptionClasses'), 'text-gray-700': !isNonDefault('uncheckedExceptionClasses') }">Unchecked exception classes</label> 262 <textarea id="uncheckedExceptionClasses" data-bind="value: uncheckedExceptionClasses, valueUpdate: 'input'" rows="2" placeholder="One class per line, e.g. \LogicException" class="w-full text-sm rounded-md border-gray-300 font-mono dark:border-current"></textarea> 263 </div> 264 <div> 265 <label for="checkedExceptionClasses" class="block text-sm font-medium mb-1" data-bind="css: { 'text-blue-600': isNonDefault('checkedExceptionClasses'), 'text-gray-700': !isNonDefault('checkedExceptionClasses') }">Checked exception classes</label> 266 <textarea id="checkedExceptionClasses" data-bind="value: checkedExceptionClasses, valueUpdate: 'input'" rows="2" placeholder="One class per line, e.g. \RuntimeException" class="w-full text-sm rounded-md border-gray-300 font-mono dark:border-current"></textarea> 267 </div> 268 269 <label class="flex items-center gap-2.5 cursor-pointer"> 270 <input type="checkbox" data-bind="checked: tooWideImplicitThrowType" class="border-gray-300 rounded dark:border-current"> 271 <span class="flex items-center gap-1.5" data-bind="css: { 'text-blue-600': isNonDefault('tooWideImplicitThrowType') }">
271Too wide implicit <code class="text-xs px-1 py-0.5 bg-gray-100 rounded font-mono">@throws</code> type<a href="/config-reference#exceptions.check.toowideimplicitthrowtype" target="_blank" class="text-gray-400 hover:text-gray-600" onclick="event.stopPropagation()"><svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" class="w-3.5 h-3.5"><path d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"></path></svg></a></span> 272 </label> 273 </div> 274 </fieldset> 275 </div> 276 277 <div class="mt-6 pt-5 border-t border-gray-200"> 278 <button type="button" data-bind="click: applyOptions" class="w-full md:w-auto px-5 py-2 rounded-lg text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 cursor-pointer">Apply changes</button> 279 </div> 280 </div> 281</dialog> 282 283<div class="content-playground"> 284 <span id="sectionTitle" class="hidden">Playground</span> 285 <p class="mb-4 px-4 md:px-0 pt-4">Try out PHPStan and all of its features here in the editor. <a href="/" class="underline hover:no-underline">Learn more about PHPStan »</a></p> 286 <div data-bind="visible: false" class="mx-auto w-12 h-12 my-12"> 287 <div class="spinner"></div> 288 </div> 289 <div style="display: none" data-bind="visible: true"> 290 <div data-bind="codeMirror: code, codeMirrorErrors: currentTab() !== null ? currentTab().errors : [], codeMirrorInitialUrlId: isHashMatch ? id() : null, codeMirrorUrlIdChange: onEditorUrlIdChange.bind($data), codeMirrorRestoredState: restoredEditorState, codeMirrorXRayToggle: onXRayToggle.bind($data), codeMirrorXRay: { enabled: xrayEnabled, busy: xrayBusy, tab: currentTab }"></div> 291 292 <div class="flex items-center mt-4 flex-row gap-2 md:gap-6 px-4 md:px-0"> 293 <!-- ko if: legacyResult() === null --> 294 <!-- ko if: !isSharing() --> 295 <a href="#" data-bind="click: share" class="inline-flex flex-1 md:flex-initial items-center px-2.5 py-3 rounded-lg text-md font-medium leading-4 bg-gray-100 hover:bg-gray-200 md:w-32 h-10 justify-center border-gray-300 border dark:border-black"> 296 <svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" class="w-6 h-6"><path d="M8.684 13.342C8.886 12.938 9 12.482 9 12c0-.482-.114-.938-.316-1.342m0 2.684a3 3 0 110-2.684m0 2.684l6.632 3.316m-6.632-6l6.632-3.316m0 0a3 3 0 105.367-2.684 3 3 0 00-5.367 2.684zm0 9.316a3 3 0 105.368 2.684 3 3 0 00-5.368-2.684z"></path></svg> 297 <span class="ml-2" data-bind="text: shareText"></span> 298 </a> 299 <!-- /ko --> 300 301 <!-- ko if: isSharing() --> 302 <span class="inline-flex flex-1 md:flex-initial items-center px-2.5 py-3 rounded-lg text-md font-medium leading-4 bg-gray-100 md:w-32 h-10 justify-center border-gray-300 border"> 303 <!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL --> 304 <svg width="120" height="30" viewBox="0 0 120 30" xmlns="http://www.w3.org/2000/svg" fill="#3f83f8" class="h-12 w-12"> 305 <circle cx="15" cy="15" r="15"> 306 <animate attributeName="r" from="15" to="15" 307 begin="0s" dur="0.8s" 308 values="15;9;15" calcMode="linear" 309 repeatCount="indefinite" /> 310 <animate attributeName="fill-opacity" from="1" to="1" 311 begin="0s" dur="0.8s" 312 values="1;.5;1" calcMode="linear" 313 repeatCount="indefinite" /> 314 </circle> 315 <circle cx="60" cy="15" r="9" fill-opacity="0.3"> 316 <animate attributeName="r" from="9" to="9" 317 begin="0s" dur="0.8s" 318 values="9;15;9" calcMode="linear" 319 repeatCount="indefinite" /> 320 <animate attributeName="fill-opacity" from="0.5" to="0.5" 321 begin="0s" dur="0.8s" 322 values=".5;1;.5" calcMode="linear" 323 repeatCount="indefinite" /> 324 </circle> 325 <circle cx="105" cy="15" r="15"> 326 <animate attributeName="r" from="15" to="15" 327 begin="0s" dur="0.8s" 328 values="15;9;15" calcMode="linear" 329 repeatCount="indefinite" /> 330 <animate attributeName="fill-opacity" from="1" to="1" 331 begin="0s" dur="0.8s" 332 values="1;.5;1" calcMode="linear"
333 repeatCount="indefinite" /> 334 </circle> 335 </svg> 336 </span> 337 <!-- /ko --> 338 <!-- /ko --> 339 <select class="block flex-1 md:flex-initial rounded-md border border-gray-300 dark:border-black" data-bind="value: level"> 340 <option value="0">Level 0</option> 341 <option value="1">Level 1</option> 342 <option value="2">Level 2</option> 343 <option value="3">Level 3</option> 344 <option value="4">Level 4</option> 345 <option value="5">Level 5</option> 346 <option value="6">Level 6</option> 347 <option value="7">Level 7</option> 348 <option value="8">Level 8</option> 349 <option value="9">Level 9</option> 350 <option value="10">Level 10</option> 351 </select> 352 353 <button data-bind="click: openOptions" class="inline-flex flex-1 md:flex-initial items-center px-2.5 py-3 rounded-lg text-md font-medium leading-4 bg-gray-100 hover:bg-gray-200 md:w-32 h-10 justify-center border-gray-300 border dark:border-black relative cursor-pointer"> 354 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-5 h-5"> 355 <path stroke-linecap="round" stroke-linejoin="round" d="M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.325.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 0 1 1.37.49l1.296 2.247a1.125 1.125 0 0 1-.26 1.431l-1.003.827c-.293.241-.438.613-.43.992a7.723 7.723 0 0 1 0 .255c-.008.378.137.75.43.991l1.004.827c.424.35.534.955.26 1.43l-1.298 2.247a1.125 1.125 0 0 1-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.47 6.47 0 0 1-.22.128c-.331.183-.581.495-.644.869l-.213 1.281c-.09.543-.56.94-1.11.94h-2.594c-.55 0-1.019-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 0 1-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 0 1-1.369-.49l-1.297-2.247a1.125 1.125 0 0 1 .26-1.431l1.004-.827c.292-.24.437-.613.43-.991a6.932 6.932 0 0 1 0-.255c.007-.38-.138-.751-.43-.992l-1.004-.827a1.125 1.125 0 0 1-.26-1.43l1.297-2.247a1.125 1.125 0 0 1 1.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.086.22-.128.332-.183.582-.495.644-.869l.214-1.28Z" /> 356 <path stroke-linecap="round" stroke-linejoin="round" d="M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z" /> 357 </svg> 358 <span class="ml-1.5">Options</span> 359 <!-- ko if: changedOptionsCount() > 0 --> 360 <span class="absolute -top-2 -right-2 inline-flex items-center justify-center min-w-5 h-5 px-1 text-xs font-bold text-white bg-blue-500 rounded-full" data-bind="text: changedOptionsCount"></span> 361 <!-- /ko --> 362 </button> 363 </div> 364 365 <!-- ko if: isLoading --> 366 <div class="m-auto w-12 h-12 mt-8"> 367 <div class="spinner"></div> 368 </div> 369 <!-- /ko --> 370 371 <!-- ko if: hasServerError --> 372 <span class="inline-flex text-red-500 mb-8">An error occurred. Please try again later.</span> 373 <!-- /ko --> 374 375 <!-- ko ifnot: hasServerError --> 376 377 <div class="pt-4"> 378 379 <!-- ko if: upToDateTabs() !== null && !isLoading() --> 380 <div class="flex content-center justify-center"> 381 <div class="inline-block bg-yellow-100 dark:bg-yellow-500 dark:text-white rounded-lg px-2 py-1 text-sm">This result is out of date. <a href="#" class="text-blue-700 dark:text-blue-500" data-bind="click: showUpToDateTabs">Show the latest result</a></div> 382 </div> 383 <!-- /ko --> 384 385 <!-- ko if: tabs().length > 1 && !isLoading() && legacyResult() === null --> 386 <nav class="flex mt-4 border-b border-gray-400"> 387 <!-- ko foreach: tabs --> 388 <a href="#" class="relative px-3 py-2 font-medium text-md mr-4 leading-5 rounded-md rounded-b-none text-gray-500 border-l border-t border-r" data-bind="click: $parent.switchTab.bind($parent, $index()), text: title, class: tabClass, style: { 'top': isActive() ? '1px' : '0' }"></a> 389 <!-- /ko --> 390 </nav> 391 <!-- /ko --> 392 393 <!-- ko if: currentTab() !== null && !isLoading() && legacyResult() === null --> 394 <!-- ko with: currentTab() --> 395 <div class="flex items-stretch mx-4 md:mx-0"> 396 <!-- ko if: errors.length > 0 && $parent.tabs().length < 2 --> 397 <span class="inline-flex flex-grow justify-center md:flex-grow-0 items-center px-4 py-3 h-12 rounded-lg text-lg font-medium leading-4 bg-red-100 text-red-900 mt-4 dark:border dark:border-current" data-bind="text: errorsText"></span> 398 <!-- /ko --> 399 400 <!-- ko if: errors.length === 0 --> 401 <span class="inline-flex flex-grow justify-center md:flex-grow-0 items-center px-4 py-3 h-12 rounded-lg text-lg font-medium leading-4 bg-green-100 text-green-900 mt-4 dark:border dark:border-current"> 402 No errors! 403 </span> 404 <!-- /ko --> 405 </div> 406 <!-- ko if: errors.length > 0 --> 407 <table class="w-full mt-8"> 408 <thead> 409 <tr> 410 <th class="px-6 py-3 border-b border-gray-400 bg-gray-100 text-left text-base leading-4 font-medium text-gray-800 tracking-wider"> 411 Line 412 </th> 413 <th class="px-6 py-3 border-b border-gray-400 bg-gray-100 text-left text-base leading-4 font-medium text-gray-800 tracking-wider"> 414 Error 415 </th> 416 </tr> 417 </thead> 418 <tbody class="bg-white"> 419 <!-- ko foreach: errors --> 420 <tr> 421 <td class="px-6 py-4 whitespace-nowrap border-b border-gray-200 text-base leading-5 font-medium text-gray-500" data-bind="text: line"></td> 422 <td class="px-6 py-4 border-b border-gray-200 text-base leading-5 text-gray-900"> 423 <div class="flex items-center"> 424 <div class="flex-shrink"> 425 <div data-bind="text: message" style="white-space: preserve;"></div> 426 <!-- ko if: $data.tip --> 427 <div class="mt-2 text-gray-500 text-sm" data-bind="html: $root.linkify($data.tip)"></div> 428 <!-- /ko --> 429 </div> 430 431 432 <div class="flex flex-shrink-0 ml-2 md:flex-grow md:justify-end md:ml-4"> 433 <!-- ko if: $data.identifier --> 434 <a target="_blank" class="inline-flex items-center justify-center w-6 h-6 ml-1 rounded-full bg-blue-500 hover:bg-blue-600 text-white text-xs font-bold leading-none" data-bind="attr: { href: '/error-identifiers/' + $data.identifier }">?</a> 435 <!-- /ko --> 436 </div> 437 </div> 438 </td> 439 </tr> 440 <!-- /ko --> 441 </tbody> 442 </table> 443 <!-- /ko --> 444 <!-- /ko --> 445 <!-- /ko --> 446 447 <!-- ko if: legacyResult() !== null && !isLoading() --> 448 <pre data-bind="html: legacyResult" class="bg-gray-800 w-auto p-4 mt-4 leading-none"></pre> 449 <!-- /ko --> 450 451 </div> 452 <!-- /ko --> 453 454 <div class="md:flex md:items-center md:justify-between mt-8 mb-8"> 455 <div class="flex justify-center items-center md:order-2 text-gray-400"> 456 <span class="text-sm">Theme</span> 457 <div class="ml-2 flex flex-col" data-bind="with: mainMenu"> 458 <div class="flex rounded border border-gray-400 w-36 text-sm text-gray-400"> 459 <div class="flex basis-0 flex-grow items-center justify-center py-1 font-medium text-base" data-bind="click: switchToAutoTheme, css: {'cursor-default text-white bg-gray-400': theme() === 'auto', 'curs
459or-pointer hover:text-gray-500 border-r border-gray-400': theme() !== 'auto'}" title="Theme follows system-level setting"> 460 <span>A</span> 461 </div> 462 <div class="flex basis-0 flex-grow items-center justify-center py-1" data-bind="click: switchToLightTheme, css: {'cursor-default text-white bg-gray-400': theme() === 'light', 'cursor-pointer hover:text-gray-500 border-r border-gray-400': theme() !== 'light'}" title="Theme will always use light colors"> 463 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-5"> 464 <path stroke-linecap="round" stroke-linejoin="round" d="M12 3v2.25m6.364.386-1.591 1.591M21 12h-2.25m-.386 6.364-1.591-1.591M12 18.75V21m-4.773-4.227-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0Z" /> 465 </svg> 466 </div> 467 <div class="flex basis-0 flex-grow items-center justify-center py-1" data-bind="click: switchToDarkTheme, css: {'cursor-default text-white bg-gray-400': theme() === 'dark', 'cursor-pointer hover:text-gray-500 border-gray-400': theme() !== 'dark'}" title="Theme will always use dark colors"> 468 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-5"> 469 <path stroke-linecap="round" stroke-linejoin="round" d="M21.752 15.002A9.72 9.72 0 0 1 18 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 0 0 3 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 0 0 9.002-5.998Z" /> 470 </svg> 471 </div> 472 </div> 473 </div> 474 </div> 475 <div class="flex justify-center md:order-3 mt-8 md:mt-0"> 476 <a href="https://twitter.com/phpstan" class="ml-6 text-gray-400 hover:text-gray-500" target="_blank"> 477 <span class="sr-only">Twitter</span> 478 <svg class="h-6 w-6" fill="currentColor" viewBox="0 0 24 24"> 479 <path d="M8.29 20.251c7.547 0 11.675-6.253 11.675-11.675 0-.178 0-.355-.012-.53A8.348 8.348 0 0022 5.92a8.19 8.19 0 01-2.357.646 4.118 4.118 0 001.804-2.27 8.224 8.224 0 01-2.605.996 4.107 4.107 0 00-6.993 3.743 11.65 11.65 0 01-8.457-4.287 4.106 4.106 0 001.27 5.477A4.072 4.072 0 012.8 9.713v.052a4.105 4.105 0 003.292 4.022 4.095 4.095 0 01-1.853.07 4.108 4.108 0 003.834 2.85A8.233 8.233 0 012 18.407a11.616 11.616 0 006.29 1.84"/> 480 </svg> 481 </a> 482 <a rel="me" href="https://phpc.social/@phpstan" class="ml-6 text-gray-400 hover:text-gray-500" target="_blank"> 483 <span class="sr-only">Mastodon</span> 484 <svg class="h-6 w-6" fill="currentColor" viewBox="0 0 216.4144 232.00976"> 485 <path d="M211.80734 139.0875c-3.18125 16.36625-28.4925 34.2775-57.5625 37.74875-15.15875 1.80875-30.08375 3.47125-45.99875 2.74125-26.0275-1.1925-46.565-6.2125-46.565-6.2125 0 2.53375.15625 4.94625.46875 7.2025 3.38375 25.68625 25.47 27.225 46.39125 27.9425 21.11625.7225 39.91875-5.20625 39.91875-5.20625l.8675 19.09s-14.77 7.93125-41.08125 9.39c-14.50875.7975-32.52375-.365-53.50625-5.91875C9.23234 213.82 1.40609 165.31125.20859 116.09125c-.365-14.61375-.14-28.39375-.14-39.91875 0-50.33 32.97625-65.0825 32.97625-65.0825C49.67234 3.45375 78.20359.2425 107.86484 0h.72875c29.66125.2425 58.21125 3.45375 74.8375 11.09 0 0 32.975 14.7525 32.975 65.0825 0 0 .41375 37.13375-4.59875 62.915"/> 486 <path fill="#fff" d="M177.50984 80.077v60.94125h-24.14375v-59.15c0-12.46875-5.24625-18.7975-15.74-18.7975-11.6025 0-17.4175 7.5075-17.4175 22.3525v32.37625H96.20734V85.42325c0-14.845-5.81625-22.3525-17.41875-22.3525-10.49375 0-15.74 6.32875-15.74 18.7975v59.15H38.90484V80.077c0-12.455 3.17125-22.3525 9.54125-29.675 6.56875-7.3225 15.17125-11.07625 25.85-11.07625 12.355 0 21.71125 4.74875 27.8975 14.2475l6.01375 10.08125 6.015-10.08125c6.185-9.49875 15.54125-14.2475 27.8975-14.2475 10.6775 0 19.28 3.75375 25.85 11.07625 6.36875 7.3225 9.54 17.22 9.54 29.675"/> 487 488 </svg> 489 </a> 490 <a href="https://www.youtube.com/@phpstan" class="ml-6 text-gray-400 hover:text-gray-500" target="_blank"> 491 <span class="sr-only">YouTube</span> 492 <svg viewBox="0 0 28.57 20" class="h-6 w-6" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> 493 <g> 494 <path d="M27.9727 3.12324C27.6435 1.89323 26.6768 0.926623 25.4468 0.597366C23.2197 2.24288e-07 14.285 0 14.285 0C14.285 0 5.35042 2.24288e-07 3.12323 0.597366C1.89323 0.926623 0.926623 1.89323 0.597366 3.12324C2.24288e-07 5.35042
4940 10 0 10C0 10 2.24288e-07 14.6496 0.597366 16.8768C0.926623 18.1068 1.89323 19.0734 3.12323 19.4026C5.35042 20 14.285 20 14.285 20C14.285 20 23.2197 20 25.4468 19.4026C26.6768 19.0734 27.6435 18.1068 27.9727 16.8768C28.5701 14.6496 28.5701 10 28.5701 10C28.5701 10 28.5677 5.35042 27.9727 3.12324Z"></path> 495 <path d="M11.4253 14.2854L18.8477 10.0004L11.4253 5.71533V14.2854Z" fill="white"></path> 496 </g> 497 </svg> 498 </a> 499 <a href="/rss.xml" class="ml-6 text-gray-400 hover:text-gray-500" target="_blank"> 500 <span class="sr-only">RSS</span> 501 <svg class="h-6 w-6" fill="currentColor" viewBox="0 0 24 24"> 502 <path d="M6.503 20.752c0 1.794-1.456 3.248-3.251 3.248-1.796 0-3.252-1.454-3.252-3.248 0-1.794 1.456-3.248 3.252-3.248 1.795.001 3.251 1.454 3.251 3.248zm-6.503-12.572v4.811c6.05.062 10.96 4.966 11.022 11.009h4.817c-.062-8.71-7.118-15.758-15.839-15.82zm0-3.368c10.58.046 19.152 8.594 19.183 19.188h4.817c-.03-13.231-10.755-23.954-24-24v4.812z"/> 503 </svg> 504 </a> 505 </div> 506 <div class="mt-8 md:mt-0 md:order-1 flex items-center justify-center"> 507 <div class="text-center text-sm leading-6 text-gray-400">© 2026 PHPStan s.r.o.</div> 508 </div> 509</div> 510 511 </div> 512 513</div> 514 515 516 </div> 517 </main> 518 </div> 519</div> 520 521 522 523 524</body> 525</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.