Menu

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:

Parameter Closure This #

Available in PHPStan 2.1.23

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:

Edit this page on GitHub

Theme
A
© 2025 PHPStan s.r.o.