Laravel,根据 class 个名称的输入数组自动加载 classes

Laravel, autoload classes based on an input array of class names

我有各种类,例如

<?php

namespace MyApp\Notifications;

class FirstNotification implements NotificationInterface {
    public function getMessage() {
        return 'first message';
    }
}

<?php

namespace MyApp\Notifications;

class SecondNotification implements NotificationInterface {
    public function getMessage() {
        return 'second message';
    }
}

然后我有一个像这样的数组:['First','Second']

我正在使用:

foreach (['First','Second'] as $class_prefix) {

    $class = "MyApp\Notifications\{$class_prefix}Notification";
    $object = new $class();
    echo $object->getMessage();
}

但感觉有点老套 - 有没有 better/more 标准方法来做到这一点?该数组在其他地方提供,并且会因用户而异 - 我的目标是能够轻松创建实现我的界面的 类 并且知道这个循环将能够显示他们的消息(如果它们存在)。

理想情况下,我不想预先为所有 类 添加 use 语句,或将它们传递给构造函数,我只希望魔法发生!

我假设您实际上并不是指 autoload,而是实例化 class。自动加载是将所有文件包含在应用程序中以便可以使用内容(通常为 classes)的过程。如果您使用 Laravel 5 并且遵循 PSR-4(命名空间匹配目录结构),则无需执行任何操作即可使这些 classes 可用。

您已有的代码看起来不错并且可能有效。但是,您可以使用 Laravels Service Container 来解析 class。这有很多优点,一个是自动依赖注入的可用性...

foreach (['First','Second'] as $class_prefix) {
    $object = app()->make("MyApp\Notifications\{$class_prefix}Notification");
    echo $object->getMessage();
}

甚至这样:

foreach (['First','Second'] as $class_prefix) {
    echo app()->callClass("MyApp\Notifications\{$class_prefix}Notification@getMessage");
}

但是,如果 class 不存在,两者都会导致异常。您可以事先检查或只捕获异常:

foreach (['First','Second'] as $class_prefix) {
    try{
        $object = app()->make("MyApp\Notifications\{$class_prefix}Notification");
        echo $object->getMessage();
    }
    catch(ReflectionException $e){
        // whooops
    }
}