Download the PHP package denzyl/phanalist without Composer

On this page you can find all versions of the php package denzyl/phanalist. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.

FAQ

After the download, you have to make one include require_once('vendor/autoload.php');. After that you have to import the classes with use statements.

Example:
If you use only one package a project is not needed. But if you use more then one package, without a project it is not possible to import the classes with use statements.

In general, it is recommended to use always a project to download your libraries. In an application normally there is more than one library needed.
Some PHP packages are not free to download and because of that hosted in private repositories. In this case some credentials are needed to access such packages. Please use the auth.json textarea to insert credentials, if a package is coming from a private repository. You can look here for more information.

  • Some hosting areas are not accessible by a terminal or SSH. Then it is not possible to use Composer.
  • To use Composer is sometimes complicated. Especially for beginners.
  • Composer needs much resources. Sometimes they are not available on a simple webspace.
  • If you are using private repositories you don't need to share your credentials. You can set up everything on our site and then you provide a simple download link to your team member.
  • Simplify your Composer build process. Use our own command line tool to download the vendor folder as binary. This makes your build process faster and you don't need to expose your credentials for private repositories.
Please rate this library. Is it a good library?

Informations about the package phanalist

Performant static analyzer for PHP, written in Rust. Catches common mistakes and enforces best practices with zero configuration required.

🤔 Why Phanalist?

PHP codebases grow. As they grow, they accumulate technical debt — god classes that do everything, methods no one can follow, hidden complexity that breaks with every change. Traditional linters catch syntax errors and style issues, but they don't tell you if your code is maintainable.

Phanalist focuses on structural health. It measures what matters for long-term maintainability:

Think of it as a health checkup for your PHP code. It doesn't just tell you that something is wrong — each rule explains why it matters and how to fix it.


✨ Features


Installation

The simplest way to install Phanalist is to use the installation script:

It will automatically download the executable for your platform:

There are also multiple other installation options.

GitHub Action

Add inline SARIF annotations to your PRs using the Phanalist GitHub Action:


Usage

To analyze your project sources, run:

Example

On the first run phanalist.yaml will be created with the default configuration and reused on all subsequent runs.

Additional CLI flags:

Flag Description Default
--config, -c Path to configuration file ./phanalist.yaml
--src, -s Path(s) to project sources (repeatable, e.g. -s src -s tests) ./src
--rules, -r Only run these rules (overrides config) from config
--output-format, -o Output format: text, json, sarif, codeclimate text
--summary-only Show only violation counts per rule —
--quiet, -q Suppress all output —
--verbose, -v Increase verbosity; repeat for more (-v main pass, -vv parsing, -vvv indexing) —
--debug-rule-timing Print per-rule per-file timing (min/max/avg/p90/p95/p99 + slowest files) —
--debug-rule-stats Print per-rule cost/coverage stats (time, %, violations, files, statements) —
--use-baseline Filter results against a baseline file, reporting only new violations —
--update-baseline Regenerate the baseline from the current scan (requires --use-baseline) —
--blame Attribute violations to engineers via git blame and show a quality report —
--since Only count violations from commits after this date (e.g. "30 days", "1 year", "2025-01-01") —
--until Only count violations from commits before this date (e.g. "2025-06-01") —
--export-chart Export engineer chart as PNG/SVG image (requires --blame) —
--exclude-author Exclude authors from the report (repeatable, e.g. --exclude-author dependabot) —
--min-violations Minimum total violations to include an engineer in the report 0
--lsp Start as a Language Server (LSP) for editor integrations —

Engineer Quality Report

Use the --blame flag to see who is introducing and fixing violations in your codebase:

The report shows a table with:

Column Meaning
Engineer Git author name
Fixed (✓) Violations that disappeared compared to the --since snapshot
Introduced (✗) Violations that appeared compared to the --since snapshot
Net Fixed - Introduced — positive means improving, negative means degrading

Sorting:

Use --sort to change the order: total (default, by volume), net (by net improvements), name, fixed, introduced.

How it works:

Output:

The report includes a summary table and a per-rule breakdown with colored counts (green for fixed, red for introduced).

The --blame flag works with --output-format json — the engineer data is included as an "engineer_report" field in the JSON output for use in pipelines or dashboards.

Requires a .git directory (discovered from the current working directory). Only files within --src paths are attributed.


Baseline

A baseline lets you adopt phanalist on an existing codebase without fixing every finding at once. It freezes the current violations; later runs report only new ones, so CI stays green on known debt but fails on regressions.

Generate (or regenerate) the baseline:

Then run against it (in CI, or locally):

The baseline is a pretty-printed, stably sorted JSON file, so it produces clean diffs and merges. Each entry is keyed on the file, rule, and a stable message id with a count, so unrelated edits that shift line numbers do not invalidate it, and reworded message text does not either. When you fix violations, regenerate the baseline to shrink it.


Configuration

Scanning a whole project

Pointing --src . at a project root works and stays memory-safe: each file's parse tree is released before the next one is read, so peak memory tracks the largest single file rather than the size of the tree.

Two things do still scale with the run: the violations you asked to report, and the time spent parsing. Excluding dependencies and generated code with exclude_paths is the cheapest way to cut both:


Rules

Code Name Options
E0000 Example rule
E0001 Opening tag position
E0002 Empty catch
E0003 Method modifiers
E0004 Uppercase constants
E0005 Capitalized class name
E0006 Property modifiers
E0007 Method parameters count check_constructor: true, max_parameters: 5
E0008 Return type signature
E0009 Cyclomatic complexity max_complexity: 10
E0010 Npath complexity max_paths: 200
E0011 Detect error suppression symbol (@)
E0012 Service compatibility with Shared Memory Model include_namespaces, exclude_namespaces, reset_interfaces
E0013 Private method not being used
E0014 Law of Demeter
E0015 Lack of Cohesion of Methods (LCOM4) threshold: 1
E0016 Cognitive complexity max_complexity: 15
E0017 Coupling Between Objects (CBO) max_coupling: 10
E0018 Weighted Methods per Class (WMC) max_wmc: 50
E0019 Response For a Class (RFC) max_rfc: 50
E0020 Depth of Inheritance Tree (DIT) max_depth: 4
E0021 Number of Children (NOC) max_children: 15
E0022 Afferent and Efferent Coupling (Ca/Ce) max_ca: 20, max_ce: 20
E0023 Instability, Abstractness, Distance (I/A/D) max_instability: 0.8, max_abstractness: 0.8, max_distance: 0.5
E0024 Lines of Code per Method max_loc: 30
E0025 Lines of Code per File max_loc: 500
E0026 Comment Ratio min_ratio: 0.1, max_ratio: 0.5
E0027 God Class (Brain Class) max_methods: 15, max_fields: 10
E0028 Data Class max_getter_setter_ratio: 0.7, min_methods: 3
E0029 Fan-in / Fan-out max_fan_out: 10, max_fan_in: 20
E0030 Cyclomatic Complexity Density max_density: 0.3

Adding a new rule is straightforward — this tutorial explains how.


🔌 Language Server Protocol (LSP)

Phanalist includes built-in LSP support to provide real-time, as-you-type diagnostics directly in your editor.

To start the language server, run:

Editor Configuration Examples

Neovim (using vim.lsp)

Add the following to your init.lua or filetype plugin (ftplugin/php.lua):

VS Code

You can use any generic LSP extension or configure your settings to run phanalist --lsp as a language client for PHP files.


Articles

Read a series of chapters on https://dev.to/denzyldick to understand the project's internals — a great, easy-to-read introduction.

  1. Write your own static analyzer for PHP.
  2. How I made it impossible to write spaghetti code.
  3. Detecting spaghetti code in AST of a PHP source code.
  4. Getting Symfony app ready for Swoole, RoadRunner, and FrankenPHP (no AI involved).
  5. Improve your CI output
  6. Why using unserialize in PHP is a bad idea

All versions of phanalist with dependencies

PHP Build Version
Package Version
No informations.
Composer command for our command line client (download client) This client runs in each environment. You don't need a specific PHP version etc. The first 20 API calls are free. Standard composer command

The package denzyl/phanalist contains the following files

Loading the files please wait ...