Closure Extensions
Parameter Closure Type #
Sometimes, you might want to change the type of a closure parameter to a function or method call based on the context. For example, the closure might have a generic argument, and you want to change the inner type.
You can create an extension that implements MethodParameterClosureTypeExtension:
use PhpParser\Node\Expr\MethodCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\ParameterReflection;
interface MethodParameterClosureTypeExtension
{
public function isMethodSupported(
MethodReflection $methodReflection,
ParameterReflection $parameter,
): bool;
public function getTypeTypeFromMethodCall(
MethodReflection $methodReflection,
MethodCall $methodCall,
ParameterReflection $parameter,
Scope $scope,
): ?Type;
}
The implementation needs to be registered in your configuration file:
services:
-
class: MyApp\PHPStan\SomeParameterClosureTypeExtension
tags:
- phpstan.methodParameterClosureTypeExtension
There’s also analogous functionality for:
- static methods using
StaticMethodParameterClosureTypeExtension
interface andphpstan.staticMethodParameterClosureTypeExtension
service tag. - functions using
FunctionParameterClosureTypeExtension
interface andphpstan.functionParameterClosureTypeExtension
service tag.
Parameter Closure This #
While PHPStan supports @param-closure-this
to change the meaning of $this
inside closures, sometimes static PHPDocs are not sufficient or don’t have the necessary context to describe the closure’s $this
parameter.
You can create an extension that implements MethodParameterClosureThisExtension:
use PhpParser\Node\Expr\MethodCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\ParameterReflection;
interface MethodParameterClosureThisExtension
{
public function isMethodSupported(
MethodReflection $methodReflection,
ParameterReflection $parameter,
): bool;
public function getClosureThisTypeFromMethodCall(
MethodReflection $methodReflection,
MethodCall $methodCall,
ParameterReflection $parameter,
Scope $scope,
): ?Type;
}
The implementation needs to be registered in your configuration file:
services:
-
class: MyApp\PHPStan\SomeParameterClosureThisExtension
tags:
- phpstan.methodParameterClosureThisExtension
There’s also analogous functionality for:
- static methods using
StaticMethodParameterClosureThisExtension
interface andphpstan.staticMethodParameterClosureThisExtension
service tag. - functions using
FunctionParameterClosureThisExtension
interface andphpstan.functionParameterClosureThisExtension
service tag.