komtaki / visibility-recommender
该工具用于重构对象的常量可见性。
v1.1.1
2021-03-09 12:59 UTC
Requires
- php: ^7.2 || ^8.0
- nikic/php-parser: ^4.10
Requires (Dev)
- doctrine/coding-standard: ^8.1
- phpmd/phpmd: ^2.9
- phpmetrics/phpmetrics: ^2.7
- phpstan/phpstan: ^0.12
- phpunit/phpunit: ^8.5
- squizlabs/php_codesniffer: ^3.5
- vimeo/psalm: ^4.1
This package is not auto-updated.
Last update: 2024-10-03 04:49:11 UTC
README
分析PHP文件,直接修改常量以在PSR-12上建议可见性。
4.3 属性和常量可见性必须在所有属性上声明。
如果你的项目PHP最低版本支持常量可见性(PHP 7.1或更高),则必须在所有常量上声明可见性。
https://www.php-fig.org/psr/psr-12/#43-properties-and-constants
建议的访问修饰符是 public
、private
和 protected
。
功能
- 可以自动为公共对象常量赋予三种类型
public, protected, private
。 - 仅需进行最小更改,并保留所有换行符和空格。
- 支持的文件
- 有命名空间和无命名空间混合的类。
- 有访问修饰符和无访问修饰符的常量混合。
- 纯视图文件。
- 不支持
- 可以通过字符串连接恢复常量的函数,例如
eval()
和constant()
。
- 可以通过字符串连接恢复常量的函数,例如
大致模式
当然,我们不知道常量引用是否是通过使用 eval 进行字符串连接构建的。
public
- 通过除
self
、parent
和static
之外的唯一类名获取常量。
protected
- 通过继承类中的
self
、parent
和static
获取常量。 - 通过
static
从自己的类中获取常量。 - 在继承关系中,父类和子类中声明了同名常量。
private
- 不适用于上述任何模式的常量。以下示例。
- 在自身类中声明并在自身类中通过
self
获取的常量。 - 看起来似乎没有在任何地方使用。
- 在自身类中声明并在自身类中通过
安装
composer require komtaki/visibility-recommender
示例
执行配置
declare(strict_types=1); require_once __DIR__ . '/../vendor/autoload.php'; use Komtaki\VisibilityRecommender\Commands\RecommendConstVisibility; // The directory or file name where the file you want to modify may be used. $autoloadDirs = [__DIR__ . '/../tests/Fake/FixMe']; // The directory or file name that you want to modify. $targetDir = __DIR__ . '/../tests/Fake/FixMe'; // Convert (new RecommendConstVisibility($autoloadDirs, $targetDir))->run();
之后
class Mail { // not used - const STATUS_YET = 0; + private const STATUS_YET = 0; // used by command class - const STATUS_PROCESS = 1; + public const STATUS_PROCESS = 1; // not used - public const STATUS_DONE = 2; + private const STATUS_DONE = 2; // used by view - const STATUS_CANCEL = 99; + public const STATUS_CANCEL = 99; } class MailCommand { - const PROTECTED_USE_BY_SELF = true; + protected const PROTECTED_USE_BY_SELF = true; - const PROTECTED_USE_BY_CHILD = 200; + protected const PROTECTED_USE_BY_CHILD = 200; - const PROTECTED_USE_BY_GRAND_CHILD = true; + protected const PROTECTED_USE_BY_GRAND_CHILD = true; class ExtendsMailCommand extends MailCommand { - const PROTECTED_OVERRIDE = false; + protected const PROTECTED_OVERRIDE = false; class NestExtendsMailCommand extends ExtendsMailCommand { - const PROTECTED_OVERRIDE =true; + protected const PROTECTED_OVERRIDE =true;
执行前的目标文件
./tests/Fake/FixMe/
├── Mail.php
├── commands
│ ├── ExtendsMailCommand.php
│ ├── MailCommand.php
│ └── NestExtendsMailCommand.php
└── views
└── index.php
declare(strict_types=1); class Mail { // not used const STATUS_YET = 0; // used by command class const STATUS_PROCESS = 1; // not used public const STATUS_DONE = 2; // used by view const STATUS_CANCEL = 99; }
class MailCommand { const PROTECTED_USE_BY_SELF = true; const PROTECTED_USE_BY_CHILD = 200; const PROTECTED_USE_BY_GRAND_CHILD = true; public function run() { echo Mail::STATUS_PROCESS; } public function getStatus() { return static::PROTECTED_USE_BY_SELF; } }
class ExtendsMailCommand extends MailCommand { const PROTECTED_OVERRIDE = false; public function run() { return self::PROTECTED_USE_BY_CHILD; } }
class NestExtendsMailCommand extends ExtendsMailCommand { const PROTECTED_OVERRIDE =true; public function run() { return self::PROTECTED_USE_BY_GRAND_CHILD; } }
<p><?php echo Mail::STATUS_CANCEL; ?></p>
开发可用命令
composer test // Run unit test
composer tests // Test and quality checks
composer cs-fix // Fix the coding style
composer phpstan // Run phpstan
composer psalm // Run psalm
composer run-script --list // List all commands