komtaki/visibility-recommender

该工具用于重构对象的常量可见性。

v1.1.1 2021-03-09 12:59 UTC

This package is not auto-updated.

Last update: 2024-10-03 04:49:11 UTC


README

Run tests

分析PHP文件,直接修改常量以在PSR-12上建议可见性。

4.3 属性和常量可见性必须在所有属性上声明。

如果你的项目PHP最低版本支持常量可见性(PHP 7.1或更高),则必须在所有常量上声明可见性。

https://www.php-fig.org/psr/psr-12/#43-properties-and-constants

建议的访问修饰符是 publicprivateprotected

功能

  • 可以自动为公共对象常量赋予三种类型 public, protected, private
  • 仅需进行最小更改,并保留所有换行符和空格。
  • 支持的文件
    • 有命名空间和无命名空间混合的类。
    • 有访问修饰符和无访问修饰符的常量混合。
    • 纯视图文件。
  • 不支持
    • 可以通过字符串连接恢复常量的函数,例如 eval()constant()

大致模式

当然,我们不知道常量引用是否是通过使用 eval 进行字符串连接构建的。

public

  • 通过除 selfparentstatic 之外的唯一类名获取常量。

protected

  • 通过继承类中的 selfparentstatic 获取常量。
  • 通过 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();

./bin/command

之后

 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