Register a custom PHPStan rule without a third-party extension

// In phpstan.neon:
// rules:
//     - AppTestsPHPStanNoDirectEnvAccessRule

namespace AppTestsPHPStan;

use PhpParserNode;
use PhpParserNodeExprFuncCall;
use PHPStanAnalyserScope;
use PHPStanRulesRule;

final class NoDirectEnvAccessRule implements Rule
{
    public function getNodeType(): string { return FuncCall::class; }

    public function processNode(Node $node, Scope $scope): array
    {
        if ($node->name instanceof NodeName && $node->name->toString() === 'env') {
            return ['Direct call to env() detected. Use config() in application code.'];
        }
        return [];
    }
}