How to Keep Up to Date in PHP Using Rector in CI: A Powerful 7-Step Guide

Fermin Perdomo Fermin Perdomo
schedule 7 min read

Learn how to keep your codebase modern and secure by using how to keep up to date in PHP using Rector as tool in the CI. This guide explains automation, best practices, and real-world workflows.

Introduction: Why Staying Up to Date in PHP Matters

 
Keeping a PHP codebase up to date is no longer optional. New PHP versions bring better performance, stronger typing, and improved security—but upgrading manually can be slow, risky, and error-prone. This is where automation shines.
 
The focus of this article is how to keep up to date in PHP using Rector as tool in the CI. Rector is an automated refactoring tool that upgrades and improves PHP code safely. When combined with Continuous Integration (CI), it becomes a powerful system that keeps your code modern with minimal effort.
 
By the end of this article, you’ll understand how Rector works, how to integrate it into CI pipelines, and how this approach improves code quality, team confidence, and long-term maintainability.


What Is Rector and Why PHP Teams Use It

 
Rector is an automated refactoring tool designed specifically for PHP. Instead of manually changing deprecated syntax or upgrading language features, Rector applies predefined rules to your codebase.

Example: Upgrading Deprecated PHP Syntax with Rector

Imagine you have an old PHP codebase running on PHP 7.x and you want to upgrade to PHP 8.2.

Before Rector (Legacy PHP)

<?php

class UserService
{
    public function getName(?string $name)
    {
        if ($name === null) {
            return null;
        }

        return $name;
    }
}

Problems:

  • Missing return type
  • PHP 8+ encourages stricter typing
  • Harder to reason about and maintain

After Rector (Automatically Refactored)

<?php

class UserService
{
    public function getName(?string $name): ?string
    {
        return $name;
    }
}

What Rector did:

  • Added a proper return type ?string
  • Simplified redundant logic
  • Made the method PHP 8+ compliant

Another Example: Replacing Deprecated each()

 Before (Deprecated in PHP 7.2, removed in PHP 8)

<?php

$array = ['a' => 1, 'b' => 2];

while (list($key, $value) = each($array)) {
    echo $key . ' => ' . $value . PHP_EOL;
}

After Rector

<?php

$array = ['a' => 1, 'b' => 2];

foreach ($array as $key => $value) {
    echo $key . ' => ' . $value . PHP_EOL;
}

What Rector did:

  • Removed deprecated each()
  • Replaced it with modern foreach
  • Ensured PHP 8 compatibility

The Rector Rule Behind the Scenes

use Rector\Config\RectorConfig;
use Rector\Php72\Rector\FuncCall\EachToForeachRector;

return static function (RectorConfig $config): void {
    $config->rule(EachToForeachRector::class);
};

Rector scans your codebase, detects deprecated patterns, and rewrites them safely—no guesswork, no manual edits.

 

Key Benefits of Rector

 

  • Automatically upgrades PHP syntax
  • Removes deprecated and dead code
  • Improves type safety
  • Applies framework-specific best practices
  • Reduces technical debt


Most importantly, Rector performs safe, reviewable changes, making it ideal for automation in CI environments.
 
 

Understanding CI and Its Role in PHP Maintenance

 
Continuous Integration (CI) is a development practice where code changes are automatically tested and validated. When Rector runs inside CI, it ensures that every change aligns with modern PHP standards.
 

Why CI Is Essential

 

  • Detects issues early
  • Enforces consistent standards
  • Reduces manual code reviews
  • Prevents outdated syntax from slipping into production


Using Rector inside CI ensures your PHP project evolves continuously instead of relying on large, risky upgrades.
 

How to Keep Up to Date in PHP Using Rector as Tool in the CI

 
This section explains the complete workflow of how to keep up to date in PHP using Rector as tool in the CI, from setup to automation.
 

Step 1: Install Rector in Your PHP Project

 
Rector is installed as a development dependency using Composer. This keeps it versioned and consistent across all environments.
 

composer require rector/rector --dev

You can run it from your bin directory:

vendor/bin/rector

First Run

Rector works with rector.php config file. You can create it manually, or Rector handle it for you:

vendor/bin/rector

 No "rector.php" config found. Should we generate it for you? [yes]:
 > yes


 [OK] The config is added now. Re-run command to make Rector do the work!


Step 2: Configure Rector Rules

 
Rector uses configuration files to define rules. You can:
 

  • Target specific PHP versions
  • Enable strict typing rules
  • Apply framework-specific upgrades


This configuration becomes the foundation for automated upgrades.

In rector.php you can define paths, rules and sets you want to run on your code:

<?php

use Rector\Config\RectorConfig;
use Rector\Set\ValueObject\SetList;

return RectorConfig::configure()
    ->withPaths([
        __DIR__ . '/src',
        __DIR__ . '/tests',
    ])
    ->withPreparedSets(deadCode: true);


Step 3: Run Rector Locally First

 
Before automation, run Rector locally to review its changes. This builds trust and helps teams understand what Rector modifies.

vendor/bin/rector process

Step 4: Add Rector to the CI Pipeline

 
Once stable, integrate Rector into your CI workflow. Most teams use pipelines powered by tools like GitHub Actions or GitLab CI.
For example, on this project https://github.com/masterfermin02/laravel-api-starter-kit I added the rector check on the composer file https://github.com/masterfermin02/laravel-api-starter-kit/blob/main/composer.json "test:refactor": "rector --dry-run"  so whe the pipeline of the Github Action is running will check my code base is up to date.
Example of my full composer script:

"refactor": "rector",
"test:type-coverage": "pest",
"test:unit": "pest --parallel",
"test:refactor": "rector --dry-run",
 "test": [
  "@test:unit",
  "@test:refactor"
]


Step 5: Fail Builds on Rector Changes

 
A best practice is to let CI fail if Rector introduces changes. This forces developers to:
 

  • Run Rector locally
  • Commit updated code
  • Keep the codebase modern by default


Step 6: Automate Pull Requests

 
Advanced teams configure CI to automatically open pull requests with Rector updates. This removes friction and keeps upgrades flowing.
 

Step 7: Schedule Regular Rector Runs

 
You can schedule Rector weekly or monthly using CI cron jobs. This ensures your project stays aligned with the latest PHP standards without developer intervention.
 
 

Common PHP Upgrade Tasks Rector Handles Automatically

 
Rector excels at repetitive and error-prone upgrades, such as:
 

  • Replacing deprecated functions
  • Migrating old array syntax
  • Adding strict types
  • Improving null safety
  • Refactoring legacy code patterns


These improvements directly support the goal of how to keep up to date in PHP using Rector as tool in the CI.
 
 

Best Practices for Using Rector in CI

 
To get the most value from Rector, follow these best practices:
 
Best PracticeWhy It MattersStart with small rule sets 

  • Builds trust in automation
  • Run Rector before tests 
  • Ensures tests validate new code
  • Review changes in PRs 
  • Maintains human oversight
  • Keep Rector updated 
  • Gains access to new rules
  • Document workflows 
  • Helps team adoption

 
 

Real-World Benefits for Teams

 
Teams that automate PHP upgrades with Rector and CI experience:
 

  • Faster PHP version adoption
  • Fewer production bugs
  • Lower maintenance costs
  • Higher developer confidence
  • Cleaner, future-proof code


In short, automation turns PHP upgrades from a painful event into a routine process.
 
 

Frequently Asked Questions (FAQs)

 

1. Is Rector safe to use in production projects?

 
Yes. Rector makes deterministic, testable changes that can be reviewed before merging.
 

2. Can Rector upgrade PHP versions automatically?

 
Yes. Rector supports rule sets for upgrading between PHP versions.
 

3. Does Rector replace code reviews?

 
No. It complements reviews by handling mechanical changes automatically.
 

4. How often should Rector run in CI?

 
Most teams run it on every pull request and on a scheduled basis.
 

5. Can Rector work with frameworks like Symfony or Laravel?

 
Yes. Rector provides framework-specific rule sets.
 

6. Is Rector suitable for legacy PHP applications?

 
Absolutely. Legacy projects benefit the most from automated refactoring.
 
 

Conclusion: Automate PHP Modernization with Confidence

 
Learning how to keep up to date in PHP using Rector as tool in the CI is one of the smartest investments a PHP team can make. Instead of fearing upgrades, you embrace continuous improvement.
 
By combining Rector’s automation with CI discipline, your PHP codebase stays modern, secure, and maintainable—today and in the future.
 


Reactions

lock You need to be logged in to react.
Log In

Newsletter

Get new posts delivered straight to your inbox.

mail

Great Tools for Developers

Git Tower

Git Tower

A powerful Git client for Mac and Windows that simplifies version control.

Visit arrow_forward
Mailcoach

Mailcoach

Self-hosted email marketing platform for sending newsletters and automated emails.

Visit arrow_forward
Uptimia

Uptimia

Website monitoring and performance testing tool to ensure your site is always up and running.

Visit arrow_forward
Cloudways

Cloudways

Managed cloud hosting platform that simplifies server management for developers.

Visit arrow_forward

Comments

No comments yet. Be the first to share your thoughts.

chat_bubble Join the conversation — log in to leave a comment.
Log In