Lines
Measuring the size of PHP project and its PHP features
#Lines of code and PHP Features
CLI tool for quick size measure of PHP project, and real used PHP features.
Zero dependencies. Runs anywhere.
#What are killer features?
- install anywhere - PHP 7.2? PHPUnit 6? Symfony 3? Not a problem, this package has zero dependencies and works on PHP 7.2+
- get quick overview of your project size - no details, no complexity, just lines of code
- get easy JSON output for further processing
- measure used PHP features in your project - how much PHP 8.0-features used? How many attributes? How many arrow function? How many union types?
#Install
The package is scoped and downgraded to PHP 7.2. So you can install it anywhere with any set of dependencies:
composer require tomasvotruba/lines --dev
#1. Measure Lines and Size
vendor/bin/lines measure
By default, we measure the root directory. To narrow it down, provide explicit path:
vendor/bin/lines measure src
For short output:
vendor/bin/lines measure --short
For json output, just add --json:
vendor/bin/lines measure --json
Also, you can combine them (very handy for blog posts and tweets):
vendor/bin/lines measure --short --json
For the text output, you'll get data like these:
--------------------------------------------------- -------
Filesystem Count
--------------------------------------------------- -------
Directories 32
Files 160
--------------------------------------------------- -------
--------------------------------------- -------- ----------
Lines of code Count Relative
--------------------------------------- -------- ----------
Code 15 521 70.9 %
Comments 6 372 29.1 %
Total 21 893 100 %
--------------------------------------- -------- ----------
--------------------------------------------------- -------
Structure Count
--------------------------------------------------- -------
Namespaces 32
Classes 134
* Constants 91
* Methods 1 114
Interfaces 20
Traits 4
Enums 1
Functions 36
Global constants 0
--------------------------------------------------- -------
---------------------------------------- ------- ----------
Method access Count Relative
---------------------------------------- ------- ----------
Non-static 1 058 95 %
Static 56 5 %
---------------------------------------- ------- ----------
---------------------------------------- ------- ----------
Method visibility Count Relative
---------------------------------------- ------- ----------
Public 875 78.5 %
Protected 90 8.1 %
Private 149 13.4 %
---------------------------------------- ------- ----------
Or in a json format:
{ "filesystem": { "directories": 10, "files": 15 }, "lines_of_code": { "code": 1064, "code_relative": 95.4, "comments": 51, "comments_relative": 4.6, "total": 1115 }, "structure": { "namespaces": 11, "classes": 14, "class_methods": 88, "class_constants": 0, "interfaces": 1, "traits": 0, "enums": 0, "functions": 5, "global_constants": 3 }, "methods_access": { "non_static": 82, "non_static_relative": 93.2, "static": 6, "static_relative": 6.8 }, "methods_visibility": { "public": 70, "public_relative": 79.5, "protected": 2, "protected_relative": 2.3, "private": 16, "private_relative": 18.2 } }
#Longest files
Are you looking for top 10 longest files?
vendor/bin/lines measure --longest
----------------------------------------------------- ------------ Longest files Line count ----------------------------------------------------- ------------ src/Measurements.php 320 src/Console/OutputFormatter/TextOutputFormatter.php 136 src/NodeVisitor/StructureNodeVisitor.php 124 src/Console/Command/MeasureCommand.php 98 src/Analyser.php 92 ----------------------------------------------------- ------------
#Scan package in /vendor
This tool measures your code, not the 3rd party libraries. It skips /vendor directory by default to avoid false positives. If you want to measure vendor files too, use --allow-vendor option:
vendor/bin/lines measure vendor/rector/rector --allow-vendor
#2. PHP Feature Counter
Two codebases using PHP 8.4 in composer.json, are not the same codebases. One has zero type param/return/property declarations, other has promoted properties. Reveal their real value by counting PHP feature they actually use.
vendor/bin/lines features src
For json output, just add --json:
vendor/bin/lines features src --json
This command:
- scans your codebase,
- count PHP feature being used from which PHP version,
- gives you quick overview of how modern the codebase really is
For the text output, you'll get data like these:
PHP features ============ ------------- ----------------------------------------------- ------------ PHP version PHP Feature Count ------------- ----------------------------------------------- ------------ 7.0 Parameter types 2 793 7.0 Return types 1 736 7.0 Strict declares 492 7.0 Space ship <=> operator 0 ------------- ----------------------------------------------- ------------ 7.1 Nullable type (?type) 333 7.1 Void return type 317 7.1 Class constant visibility 557 ------------- ----------------------------------------------- ------------ 7.2 Object type 14 ------------- ----------------------------------------------- ------------ 7.3 Coalesce ?? operator 69 ------------- ----------------------------------------------- ------------ 7.4 Typed properties 156 7.4 Arrow functions 38 7.4 Coalesce assign (??=) 0 ------------- ----------------------------------------------- ------------ 8.0 Named arguments 10 8.0 Union types 147 8.0 Match expression 1 8.0 Nullsafe method call/property fetch 0 8.0 Attributes 0 8.0 Throw expression 111 8.0 Promoted properties 596 ------------- ----------------------------------------------- ------------ 8.1 First-class callables 8 8.1 Readonly property 3 8.1 Intersection types 0 8.1 Enums 0 ------------- ----------------------------------------------- ------------ 8.2 Readonly class 182 ------------- ----------------------------------------------- ------------ 8.3 Typed class constants 0 ------------- ----------------------------------------------- ------------ 8.4 Property hooks 0 ------------- ----------------------------------------------- ------------
Or in a json format:
{ "7.0": [ { "name": "Parameter types", "count": 122 }, { "name": "Return types", "count": 143 }, { "name": "Strict declares", "count": 31 }, { "name": "Space ship <=> operator ", "count": 0 }, { "name": "Coalesce ?? operator", "count": 1 } ], "7.1": [ { "name": "Nullable type (?type)", "count": 5 }, { "name": "Void return type", "count": 48 }, { "name": "Class constant visibility", "count": 15 } ], "7.2": [ { "name": "Object type", "count": 3 } ], "7.4": [ { "name": "Typed properties", "count": 26 }, { "name": "Arrow functions", "count": 25 }, { "name": "Coalesce assign (??=)", "count": 0 } ], "8.0": [ { "name": "Named arguments", "count": 14 }, { "name": "Union types", "count": 5 }, { "name": "Match expression", "count": 0 }, { "name": "Nullsafe method call\/property fetch", "count": 0 }, { "name": "Attributes", "count": 0 }, { "name": "Throw expression", "count": 0 }, { "name": "Promoted properties", "count": 30 } ], "8.1": [ { "name": "First-class callables", "count": 0 }, { "name": "Readonly property", "count": 0 }, { "name": "Intersection types", "count": 0 }, { "name": "Enums", "count": 1 } ], "8.2": [ { "name": "Readonly class", "count": 6 } ], "8.3": [ { "name": "Typed class constants", "count": 9 } ], "8.4": [ { "name": "Property hooks", "count": 0 } ] }
That's it. Happy coding!