phpstan-bot publicó PHPStan 2.3.0 el 6 de octubre. La versión corrige 75 problemas. El equipo informa de una mejora importante de rendimiento: analizar el núcleo de WordPress requería 60 segundos con PHPStan 2.1.33, publicado en diciembre de 2025, y tarda menos de 8 segundos con 2.3.0.
includes:
- vendor/phpstan/phpstan/conf/bleedingEdge.neonPHPStan Turbo cubre ahora la mayor parte del motor de análisis. La extensión aporta un 60 % más de velocidad frente a la ejecución sin Turbo. La versión también reduce el tamaño de los binarios de Turbo, refuerza su recorrido y el manejo de arenas, reutiliza binarios compilados con entradas idénticas y acelera las ejecuciones con la caché de resultados ya preparada.
El análisis Bleeding Edge amplía la inferencia de generics. PHPStan elimina la generalización escalar y puede inferir new Foo() a partir de sus usos mediante varias pasadas. El cambio aporta narrowing bidireccional de tipos. La herramienta detecta variables sin uso y escrituras cuyo valor nunca llega a una lectura, incluidos los offsets de arrays. Las firmas de las closures pueden inferirse desde los destinos de sus valores. Los efectos de los usos por referencia se aplican en el punto de llamada, y el tipo de las variables estáticas se obtiene del cuerpo de la función.
Otros cambios de análisis incluyen una reescritura interna de una sola pasada, realizada desde el interior hacia fuera, @pure-unless-parameter-passed, los delimitadores de preg_quote en patrones de arrays y los tipos PHPDoc static::FOO_* o T::FOO_* una vez conocida la clase.
Las correcciones mejoran el análisis de scopes y del flujo de control. Los accesos a propiedades permanecen asociados al receptor después de que un método estático o una closure estática lo invalide. Los tipos de las guardas condicionales se derivan de las diferencias entre ramas. El análisis de bucles construye el enlace de retorno a partir de continue cuando el final del cuerpo es inalcanzable. El widening del scope también limita el seguimiento a las variables que el bucle puede escribir. Los tipos de parámetros de closures en argumentos de arrays y los parámetros genéricos obtenidos del esqueleto de un literal de array se infieren antes. Los contenedores de expresiones condicionales sobreviven a más fusiones de scopes, e isset() estrecha los offsets de arrays opcionales.
PHPStan deja de leer PHP_SBINDIR y PHP_BUILD_PROVIDER de la máquina analizada. Scope::getPhpVersion() respeta ahora la restricción require.php de composer.json y dirige las comprobaciones de constantes de clase tipadas, funciones disponibles según PHP, propiedades, constantes de traits, arrow functions, formatos de printf, casts obsoletos y tipos de extensiones. Una cadena nullsafe que se corta no aplica @phpstan-assert, tipos de retorno condicionales ni efectos de llamada. Otras correcciones afectan a los casts de floats fuera del rango de int o con NAN, los valores similares a callable, el narrowing de ??, la conservación de never, las uniones de arrays, los límites de templates, las llamadas impuras, los parámetros variádicos por referencia, los métodos privados de traits y las firmas obsoletas de phpredis.
Las optimizaciones abarcan offsets de arrays constantes, eliminación de casos de enums, conteo de tipos finitos, grandes uniones, widening de shapes en bucles, consultas de nombres de reflexión, TypeCombinatorCache, caché de archivos, memoización de tipos, claves de expresiones, NamespaceUses, contenido de archivos sin cambios, inferencia de closures y variables estáticas, y resultados de dependencias. Se añade TypeTraverser::mapMemoized(). Las funciones declaradas dentro de funciones dejan de exportarse, y ConstantArrayType->checkOurKeys() evita trabajo duplicado.
Las firmas declaran grupos de constantes mutuamente excluyentes para json_encode, json_decode, filter_var, filter_input, openlog y ZipArchive::open. Los tipos de arrays sobredimensionados generalizan mejor sus claves y valores. Los cambios internos trasladan las dependencias de la caché de resultados a los scopes, marcan ResultCacheMetaExtension como obsoleto, mejoran OpenSslCipherMethodsProvider, dividen NodeScopeResolver y permiten que una regla escuche varios tipos de nodos. Entre los colaboradores figuran staabm, zonuexe, rubas, arpitjain099, calebdw, Jean-Beru, VincentLanglet y SanderMuller.




Comentarios
Aún no hay comentarios — escribe el primero.
Inicia la conversación
Sin cuenta ni contraseña — introduce tu correo y te enviamos un enlace de acceso de un solo uso. ¿Primera vez? Todo se configura automáticamente.
Tu valoración se aplicará automáticamente al iniciar sesión.
Revisa tu bandeja de entrada
Hemos enviado un enlace de acceso a …. Ábrelo en este dispositivo — esta pestaña te conectará automáticamente.
¿No llega nada? Mira en la carpeta de spam — y marca el correo como «No es spam» para que la próxima vez llegue directo.