There are often more known types in your project than meets the eye.
This tool detects the real types passed into method and function calls using PHPStan.
$this->hotelOverview->makeRoomAvailable(324);Later in the code...
public function roomDetail(int $roomNumber)
{
$this->hotelOverview->makeRoomAvailable($roomNumber);
}Later in tests...
public function test(int $roomNumber): void
{
$this->hotelOverview->makeRoomAvailable($roomNumber);
}✅ Three times an int value is passed into makeRoomAvailable().
Then Rector runs and fills in the missing type declarations:
final class HotelOverview
{
- public function makeRoomAvailable($roomNumber)
+ public function makeRoomAvailable(int $roomNumber)
{
}
}✅ An int parameter type is added to the makeRoomAvailable() method.
That’s it.
composer require rector/argtyper --devRun it in your project directory:
vendor/bin/argtyper add-types .Or on another project:
vendor/bin/argtyper add-types projectTo see more details during the process, add the --debug option.
At first, a set of custom PHPStan rules scans your code and records the argument types passed to method calls, static calls, new expressions, and function calls. It stores this data in temporary *.json files in the following format:
[
{
"class": "HotelOverview",
"method": "makeRoomAvailable",
"position": 0,
"type": "PHPStan\\Type\\IntegerType"
}
]Then, custom Rector rules go through the codebase and fill in the known parameter types based on the collected data — but only where they’re missing.
With a few exceptions:
- If multiple types are found → it’s skipped.
- If union or intersection types are found → it’s skipped as ambiguous.
- If a
floatparameter type is declared but onlyintarguments are passed (e.g.30.0) → it’s skipped to avoid losing decimal precision.
It’s not 100 % perfect, but in our tests it fills in about 95 % of the data correctly and saves a huge amount of manual work.
You can fix the remaining cases manually based on PHPStan or test feedback.
Happy coding!