动态文件系统 class 自动创建特定 class 的实例(在 PHP 和 PhpStorm 中)

Dynamic file system class to automatically create an instance of a specific class (in PHP and PhpStorm)

我创建了一个加载特定 class 的函数,并且还应创建此 class:

的新实例
class File {

public static function load($file, $folder = null, $local = false, $classname = null) {
    if ($folder == 'root') {
        $dir = '';
    } elseif ($folder) {
        $dir = $folder . '/';
    } else {
        $dir = 'classes/';
    }
    if ($local) {
        $root = ROOT_ABS;
    } else {
        $root = ROOT_CMS_ABS;
    }
    require_once $root . $dir .  $file . '.php';
    // New Instance
    if ($folder == null || $classname) {
        if (!$classname) {
        return new $file();
        } else {
        return new $classname();
        }
    }
}

我内置了一些额外的参数来指定是否应该访问我的 CMS 文件夹(ROOT_CMS_ABSROOT_ABS 常量)。因此,加载文件并创建对象的最小默认情况是例如:

$html = File::load('html');


问题:

我正在使用 PhpStorm,通常我可以按住 Ctrl + Click 来跳转到一个对象的函数。

但是现在 PhpStorm 无法识别加载了哪个 class。在我的示例中,这是因为我将 $router 分配给此 class 而不是编写 $router = new AltoRouter();.


问题:

1) PhpStorm 是否可以通过另一种方式识别我所指的class?

2) 我对 PHP 中的 OOP 有点陌生,我能以某种方式改进我的 class 吗?

__

否则功能正常。所以这更有可能是 IDE 问题。

您可以通过在此类分配之前添加带有类型提示的内联 PHPDoc 注释来轻松解决它。例如:

/** @var MyClassName $router */
$router = File::load('AltoRouter', 'route');

除此之外:使用 $router = new AltoRouter(); 更好——将实际的 class 加载留给 class 自动加载机制(遵循 PSR-4;成为标准的 Composer ..或您自己的实现)。