ptscs is a PHP_CodeSniffer ruleset based on PSR-12 with stricter rules for consistency, readability, and best practices.
composer require --dev asispts/ptscs
Create a phpcs.xml.dist file in your project root with the following configuration (customize as needed for your project structure):
<?xml version="1.0" encoding="UTF-8"?>
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="vendor/squizlabs/php_codesniffer/phpcs.xsd">
<arg name="colors" />
<arg name="parallel" value="8" />
<arg value="psv" />
<arg name="extensions" value="php" />
<file>src</file>
<file>tests</file>
<exclude-pattern>vendor</exclude-pattern>
<rule ref="ptscs" />
<!-- Example: exclude a rule -->
<!-- (e.g. disable abstract/final requirement in symfony entities) -->
<rule ref="SlevomatCodingStandard.Classes.RequireAbstractOrFinal">
<exclude-pattern>src/Entity</exclude-pattern>
</rule>
<!-- Example: add an extra rule -->
<!-- (e.g. enforce namespace matches file name; useful where PHPStan falls short) -->
<rule ref="SlevomatCodingStandard.Files.TypeNameMatchesFileName">
<properties>
<property name="rootNamespaces" type="array">
<element key="ptscs" value="Ptscs" />
<element key="tests" value="Ptscs\Tests" />
</property>
</properties>
</rule>
</ruleset>
This coding standard uses PSR-12 with some changes and stricter requirements:
declare(strict_types=1)is required in all PHP files and must be on the same line as the opening tag:<?php declare(strict_types=1)
snake_caseis allowed in test method names:public function test_something(): void {}
- All classes must be declared as
finalorabstract:// Not allowed class Foobar {}
- Filenames must match class names.
See the full list in RULES.md.
Contributions are welcome! Please open an issue to discuss major changes before submitting a pull request.
Released under MIT License.