Skip to content
Instant Upgrades and Instant Refactoring of any PHP 5.3+ code
Branch: master
Clone or download
TomasVotruba Merge pull request #2420 from RusiPapazov/update-new-to-static-docume…

Fix NewToStaticCallRector documentation
Latest commit 3fcf2c1 Dec 10, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github hide Github funding support - waits for Czech Republic Nov 10, 2019
bin load just once experiment Dec 8, 2019
ci fix space fixer Nov 16, 2019
compiler various fixes Dec 9, 2019
config Merge pull request #2373 from rectorphp/compiler Dec 9, 2019
docs bump to PHPStan 0.12 Dec 8, 2019
packages StaticTypeMapper - missing boolean type Dec 9, 2019
src Fix NewToStaticCallRector configuration definition Dec 10, 2019
stubs bump to PHPStan 0.12 Dec 8, 2019
tests bump to PHPStan 0.12 Dec 8, 2019
utils various fixes Dec 9, 2019
.coveralls.yml travis: add coverage Oct 28, 2018
.dockerignore update backers Nov 24, 2019
.editorconfig improve attributes, add .editorconfig Dec 13, 2018
.gitattributes fixup! Merge pull request #2409 from rectorphp/phalcon-round-2 Dec 8, 2019
.gitignore update gitignore [skip ci] Dec 1, 2019
.phpstorm.meta.php Rewrite of expression to previous statement Oct 27, 2019
.travis.yml travis: run push phar only on master Dec 10, 2019 update backers Nov 24, 2019 dump changelog Dec 10, 2019 Use HTTPS instead of HTTP Feb 14, 2018
Dockerfile chore: use php 7.4 cli Dec 4, 2019
LICENSE Update LICENSE year forever Jan 2, 2018 rename must-match-git-diff to shorter and easier to write match-git-diff Nov 24, 2019
changelog-linker.yaml init CHANGELOG for 0.4.11 Apr 13, 2019
composer.json various fixes Dec 9, 2019
ecs-after-rector.yaml README: add ecs set mention Nov 8, 2019
ecs.yaml fixup! Merge pull request #2409 from rectorphp/phalcon-round-2 Dec 8, 2019
phpstan.neon various fixes Dec 9, 2019
phpunit.xml small tests refactoring Oct 5, 2019
rector-ci.yaml add paths parameter Nov 10, 2019
rector.yaml various fixes Dec 9, 2019

Rector - Upgrade Your Legacy App to a Modern Codebase

Rector is a reconstructor tool - it does instant upgrades and instant refactoring of your code. Why refactor manually if Rector can handle 80% for you?

Build Status Coverage Status Downloads



Rector grows faster with your help, the more you help the more work it saves you. Check out Rector's Patreon. One-time donation is welcomed through PayPal.

Thank you:

Open-Source First

Rector instantly upgrades and instantly refactors the PHP code of your application. It supports all modern versions of PHP and many open-source projects:

What Can Rector Do for You?

...look at the overview of all available Rectors with before/after diffs and configuration examples. You can use them to build your own sets.

How to Apply Coding Standards?

The AST libraries that Rector uses aren't well-suited for coding standards, so it's better to let coding standard tools do that.

Don't have a coding standard tool for your project? Consider adding EasyCodingStandard, PHP CS Fixer or PHP_CodeSniffer.

Tip: If you have EasyCodingStandard, you can start your set with ecs-after-rector.yaml.


composer require rector/rector --dev

Did you have conflicts during composer require or on run?

Running Rector

A. Prepared Sets

Featured open-source projects have prepared sets. You can find them in /config/set or by running:

vendor/bin/rector sets

Let's say you pick the symfony40 set and you want to upgrade your /src directory:

# show a list of known changes in Symfony 4.0
vendor/bin/rector process src --set symfony40 --dry-run
# apply upgrades to your code
vendor/bin/rector process src --set symfony40

Some sets, such as code-quality can be used on a regular basis. You can include them in your rector.yaml to run them by default:

# rector.yaml
        - 'code-quality'
        - 'php71'
        - 'php72'
        - 'php73'

B. Custom Sets

  1. Create a rector.yaml config file with your desired Rectors:

            $annotation: "inject"
  2. Run Rector on your /src directory:

    vendor/bin/rector process src --dry-run
    # apply
    vendor/bin/rector process src


Extra Autoloading

Rector relies on project and autoloading of its classes. To specify your own autoload file, use --autoload-file option:

vendor/bin/rector process ../project --autoload-file ../project/vendor/autoload.php

Or use a rector.yaml config file:

# rector.yaml
        - 'vendor/squizlabs/php_codesniffer/autoload.php'
        - 'vendor/project-without-composer'

Exclude Paths and Rectors

You can also exclude files or directories (with regex or fnmatch):

# rector.yaml
        - '*/src/*/Tests/*'

You can use a whole ruleset, except one rule:

# rector.yaml
        - 'Rector\CodeQuality\Rector\If_\SimplifyIfReturnBoolRector'

Provide PHP Version

By default Rector uses the language features matching your system version of PHP. You can configure it for a different PHP version:

# rector.yaml
    php_version_features: '7.2' # your version is 7.3


If you're annoyed by repeating paths in arguments, you can move them to config instead:

# rector.yaml
        - 'src'
        - 'tests'

Import Use Statements

FQN classes are imported by default every time Rector performs a change, so you don't have to do it manually/after each run. You can disable it by:

# rector.yaml
    auto_import_names: false

Limit Execution to Changed Files

Execution can be limited to changed files using the process option --match-git-diff. This option will filter the files included by the configuration, creating an intersection with the files listed in git diff.

vendor/bin/rector process src --match-git-diff

This option is useful in CI with pull-requests that only change few files.

3 Steps to Create Your Own Rector

First, make sure it's not covered by any existing Rectors.

Let's say we want to change method calls from set* to change*.

 $user = new User();

1. Create a New Rector and Implement Methods

Create a class that extends Rector\Rector\AbstractRector. It will inherit useful methods e.g. to check node type and name. See the source (or type $this-> in an IDE) for a list of available methods.



namespace App\Rector;

use Nette\Utils\Strings;
use PhpParser\Node;
use PhpParser\Node\Identifier;
use PhpParser\Node\Expr\MethodCall;
use Rector\Rector\AbstractRector;
use Rector\RectorDefinition\CodeSample;
use Rector\RectorDefinition\RectorDefinition;

final class MyFirstRector extends AbstractRector
    public function getDefinition(): RectorDefinition
        // what does this do?
        // minimalistic before/after sample - to explain in code
        return new RectorDefinition('Change method calls from set* to change*.', [
            new CodeSample('$user->setPassword("123456");', '$user->changePassword("123456");')

     * @return string[]
    public function getNodeTypes(): array
        // what node types we look for?
        // pick any node from
        return [MethodCall::class];

     * @param MethodCall $node - we can add "MethodCall" type here, because only this node is in "getNodeTypes()"
    public function refactor(Node $node): ?Node
        // we only care about "set*" method names
        if (! $this->isName($node, 'set*')) {
            // return null to skip it
            return null;

        $methodCallName = $this->getName($node);
        $newMethodCallName = Strings::replace($methodCallName, '#^set#', 'change');

        $node->name = new Identifier($newMethodCallName);

        // return $node if you modified it
        return $node;

2. Register It

# rector.yaml
    App\Rector\MyFirstRector: ~

3. Let Rector Refactor Your Code

# see the diff first
vendor/bin/rector process src --dry-run

# if it's ok, apply
vendor/bin/rector process src

That's it!

More Detailed Documentation

How to Contribute

Just follow 3 rules:

  • 1 feature per pull-request

  • New features need tests

  • Tests, coding standards and PHPStan checks must pass:

    composer complete-check

    Do you need to fix coding standards? Run:

    composer fix-cs

We would be happy to accept PRs that follow these guidelines.

Run Rector in Docker

You can run Rector on your project using Docker:

docker run -v $(pwd):/project rector/rector:latest process /project/src --set symfony40 --dry-run

# Note that a volume is mounted from `pwd` (the current directory) into `/project` which can be accessed later.

Using rector.yaml:

docker run -v $(pwd):/project rector/rector:latest process /project/app --config /project/rector.yaml --autoload-file /project/vendor/autoload.php --dry-run

Community Packages

Do you use Rector to upgrade your code? Add it here:

You can’t perform that action at this time.