PHPackages                             orrison/meliorstan - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Testing &amp; Quality](/categories/testing)
4. /
5. orrison/meliorstan

ActivePhpstan-extension[Testing &amp; Quality](/categories/testing)

orrison/meliorstan
==================

Provides PHPStan rules for improved code quality by detecting code smells and possible issues. In addition to enforcing particular naming and code style conventions to reduce bike-shedding.

v0.4.2(3mo ago)126.6k—8.9%[29 issues](https://github.com/Orrison/MeliorStan/issues)1MITPHPPHP ^8.3CI passing

Since Aug 16Pushed 3mo ago2 watchersCompare

[ Source](https://github.com/Orrison/MeliorStan)[ Packagist](https://packagist.org/packages/orrison/meliorstan)[ Docs](https://github.com/Orrison/MeliorStan)[ RSS](/packages/orrison-meliorstan/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (10)Dependencies (4)Versions (13)Used By (1)

MeliorStan
==========

[](#meliorstan)

**Advanced PHPStan Rules for Code Quality and Consistency**

*Enhance your PHP codebase with intelligent static analysis rules that detect code smells, enforce naming conventions, and promote best practices.*

[![Latest Stable Version](https://camo.githubusercontent.com/21c776776edb33c8419466092d75f61b66ebba0bf0891abcb725405b91a3370d/68747470733a2f2f706f7365722e707567782e6f72672f6f727269736f6e2f6d656c696f727374616e2f762f737461626c65)](https://packagist.org/packages/orrison/meliorstan)[![Total Downloads](https://camo.githubusercontent.com/fa6a34ef42a62fe2252fa6ae5c65064c201a07c36f3660fe1ce6d30aea0af1be/68747470733a2f2f706f7365722e707567782e6f72672f6f727269736f6e2f6d656c696f727374616e2f646f776e6c6f616473)](https://packagist.org/packages/orrison/meliorstan/stats)[![License](https://camo.githubusercontent.com/4a5c8bc9aff8a63cab84ee184cdb1c393f7dd5dc4fee6906d3959f26739b8a7b/68747470733a2f2f706f7365722e707567782e6f72672f4f727269736f6e2f4d656c696f725374616e2f6c6963656e7365)](https://choosealicense.com/licenses/mit/)[![PHP Version](https://camo.githubusercontent.com/83d697baa78e4225d630587096ed1b0d8a0ece94e9b2ebab599fc9bb986477ac/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e332b2d626c75652e737667)](https://php.net/)[![PHPStan](https://camo.githubusercontent.com/13ceb54b92000efc4331360a4f2930a19759ed9be1f4d4ae965ef0f06eee024a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048505374616e2d322e312b2d6f72616e67652e737667)](https://phpstan.org/)

---

Table of Contents
-----------------

[](#table-of-contents)

- [Features](#-features)
- [Quick Start](#-quick-start)
- [Available Rules](#-available-rules)
- [Configuration](#-configuration)
- [Inspiration](#-inspiration)
- [License](#-license)
- [Acknowledgments](#-acknowledgments)

Features
--------

[](#features)

- **Comprehensive Code Analysis**: Detect code smells and potential issues
- **Naming Convention Enforcement**: Ensure consistent naming across your codebase
- **Highly Configurable**: Customize rules to match your project's standards
- **Modern PHP Support**: Built for PHP 8.3+ with PHPStan 2.1+
- **Extensive Documentation**: Detailed guides for each rule
- **Well Tested**: Comprehensive test suite ensuring reliability

Quick Start
-----------

[](#quick-start)

### Installation

[](#installation)

```
composer require --dev orrison/meliorstan
```

### Basic Usage

[](#basic-usage)

Add to your `phpstan.neon` configuration:

```
includes:
    - vendor/orrison/meliorstan/config/extension.neon

rules:
    - Orrison\MeliorStan\Rules\PascalCaseClassName\PascalCaseClassNameRule
    - Orrison\MeliorStan\Rules\CamelCaseMethodName\CamelCaseMethodNameRule
```

### Configuration

[](#configuration)

Customize rule behavior in your `phpstan.neon`:

```
parameters:
    meliorstan:
        pascal_case_class_name:
            allow_consecutive_uppercase: false
        camel_case_method_name:
            allow_consecutive_uppercase: false
            allow_underscore_prefix: false
```

Available Rules
---------------

[](#available-rules)

### Naming Conventions

[](#naming-conventions)

RuleDescriptionTarget**[BooleanGetMethodName](docs/BooleanGetMethodName.md)**Prevents `get*` methods from returning boolean valuesMethods**[CamelCaseMethodName](docs/CamelCaseMethodName.md)**Enforces camelCase for method namesMethods**[CamelCaseParameterName](docs/CamelCaseParameterName.md)**Enforces camelCase for parameter namesParameters**[CamelCasePropertyName](docs/CamelCasePropertyName.md)**Enforces camelCase for property namesProperties**[CamelCaseVariableName](docs/CamelCaseVariableName.md)**Enforces camelCase for variable namesVariables**[ConstantNamingConventions](docs/ConstantNamingConventions.md)**Enforces UPPERCASE for constantsConstants**[ConstructorWithNameAsEnclosingClass](docs/ConstructorWithNameAsEnclosingClass.md)**Prevents methods with same name as their classMethods**[LongClassName](docs/LongClassName.md)**Limits class/interface/trait/enum name lengthClasses, Interfaces, Traits, Enums**[PascalCase Class Name](docs/PascalCaseClassName.md)**Enforces PascalCase for class namesClasses**[ShortClassName](docs/ShortClassName.md)**Enforces minimum class/interface/trait/enum name lengthClasses, Interfaces, Traits, Enums**[TraitConstantNamingConventions](docs/TraitConstantNamingConventions.md)**Enforces UPPERCASE for trait constantsTrait Constants### Code Quality

[](#code-quality)

RuleDescriptionTarget**[BooleanArgumentFlag](docs/BooleanArgumentFlag.md)**Detects boolean parameters in functions and methods that may indicate multiple responsibilitiesMethods, Functions, Closures**[LongVariable](docs/LongVariable.md)**Limits variable name lengthVariables**[MissingClosureParameterTypehint](docs/MissingClosureParameterTypehint.md)**Requires type hints on closure parametersClosures**[ShortMethodName](docs/ShortMethodName.md)**Enforces minimum method name lengthMethods**[ShortVariable](docs/ShortVariable.md)**Enforces minimum variable name lengthVariables**[ForbidPestPhpOnly](docs/ForbidPestPhpOnly.md)**Prevents committed Pest tests from using the `only()` filterTests**[Superglobals](docs/Superglobals.md)**Discourages use of PHP superglobalsSuperglobal Usage### Control Flow

[](#control-flow)

RuleDescriptionTarget**[ElseExpression](docs/ElseExpression.md)**Discourages `else` expressionsControl Flow### Design

[](#design)

RuleDescriptionTarget**[EmptyCatchBlock](docs/EmptyCatchBlock.md)**Detects and reports empty catch blocks in exception handlingCatch Blocks**[ForbidCountInLoopExpressions](docs/ForbidCountInLoopExpressions.md)**Detects usage of count() or sizeof() in loop conditionsLoop Conditions**[ForbidEvalExpressions](docs/ForbidEvalExpressions.md)**Detects and reports usage of eval expressionsEval Expressions**[ForbidExitExpressions](docs/ForbidExitExpressions.md)**Detects and reports usage of exit and die expressionsExit Expressions**[ForbidGotoStatements](docs/ForbidGotoStatements.md)**Detects and reports usage of goto statementsGoto Statements**[CyclomaticComplexity](docs/CyclomaticComplexity.md)**Detects methods with high cyclomatic complexityMethods, Classes**[NumberOfChildren](docs/NumberOfChildren.md)**Detects classes with too many direct child classesClass Hierarchy**[TooManyMethods](docs/TooManyMethods.md)**Detects classes with too many methodsClasses, Interfaces, Traits, EnumsConfiguration
-------------

[](#configuration-1)

Each rule supports extensive configuration options. Refer to individual rule documentation for detailed configuration parameters.

### Global Configuration Structure

[](#global-configuration-structure)

```
parameters:
    meliorstan:
        rule_name:
            option1: value1
            option2: value2
```

### Example: Comprehensive Setup

[](#example-comprehensive-setup)

```
includes:
    - vendor/orrison/meliorstan/config/extension.neon

rules:
    - Orrison\MeliorStan\Rules\PascalCaseClassName\PascalCaseClassNameRule
    - Orrison\MeliorStan\Rules\CamelCaseMethodName\CamelCaseMethodNameRule
    - Orrison\MeliorStan\Rules\LongClassName\LongClassNameRule

parameters:
    meliorstan:
        pascal_case_class_name:
            allow_consecutive_uppercase: true
        camel_case_method_name:
            allow_consecutive_uppercase: false
            allow_underscore_prefix: false
        long_class_name:
            maximum: 50
            subtract_prefixes: ["Abstract", "Base"]
            subtract_suffixes: ["Interface", "Trait"]
```

Inspiration
-----------

[](#inspiration)

Originally inspired by [**PHPMD - PHP Mess Detector**](https://phpmd.org/), this project provides modern PHPStan equivalents with enhanced configurability and PHP 8+ features.

> **Note**: While inspired by PHPMD, these rules are not exact replicas. They may offer additional or renamed customization options and are adapted for PHPStan's architecture and modern PHP practices.

Contributing
------------

[](#contributing)

We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.

License
-------

[](#license)

This project is licensed under the **MIT License** - see the [LICENSE](LICENSE) file for details.

Acknowledgments
---------------

[](#acknowledgments)

- [**PHPStan**](https://phpstan.org/) - The foundation of modern PHP static analysis
- [**PHPMD**](https://phpmd.org/) - Original inspiration for code quality rules

---

[Documentation](docs/) • [Report Issues](https://github.com/orrison/meliorstan/issues)

###  Health Score

41

—

FairBetter than 89% of packages

Maintenance60

Regular maintenance activity

Popularity32

Limited adoption so far

Community14

Small or concentrated contributor base

Maturity48

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 99% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~19 days

Recently: every ~27 days

Total

10

Last Release

105d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/c05c414ab831b19b4d32267debcdd34330d8950f9842cca89427ee10a1b1e872?d=identicon)[Orrison](/maintainers/Orrison)

---

Top Contributors

[![Orrison](https://avatars.githubusercontent.com/u/6799341?v=4)](https://github.com/Orrison "Orrison (201 commits)")[![dependabot[bot]](https://avatars.githubusercontent.com/in/29110?v=4)](https://github.com/dependabot[bot] "dependabot[bot] (2 commits)")

---

Tags

PHPStanphpstan-rules

###  Code Quality

TestsPHPUnit

Code StylePHP CS Fixer

### Embed Badge

![Health badge](/badges/orrison-meliorstan/health.svg)

```
[![Health](https://phpackages.com/badges/orrison-meliorstan/health.svg)](https://phpackages.com/packages/orrison-meliorstan)
```

###  Alternatives

[larastan/larastan

Larastan - Discover bugs in your code without running it. A phpstan/phpstan extension for Laravel

6.4k43.5M5.2k](/packages/larastan-larastan)[ekino/phpstan-banned-code

Detected banned code using PHPStan

2925.6M92](/packages/ekino-phpstan-banned-code)[shipmonk/dead-code-detector

Dead code detector to find unused PHP code via PHPStan extension. Can automatically remove dead PHP code. Supports libraries like Symfony, Doctrine, PHPUnit etc. Detects dead cycles. Can detect dead code that is tested.

3462.2M52](/packages/shipmonk-dead-code-detector)[szepeviktor/phpstan-wordpress

WordPress extensions for PHPStan

3287.8M898](/packages/szepeviktor-phpstan-wordpress)[staabm/phpstan-dba

2912.3M2](/packages/staabm-phpstan-dba)[staabm/phpstan-todo-by

1991.8M55](/packages/staabm-phpstan-todo-by)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
