Laravel,基于类名的输入数组自动加载类

Laravel,基于类名的输入数组自动加载类,laravel,autoload,Laravel,Autoload,我有各种各样的课程,例如 <?php namespace MyApp\Notifications; class FirstNotification implements NotificationInterface { public function getMessage() { return 'first message'; } } 但这感觉有点粗糙-有没有更好/更标准的方法来做到这一点?数组是在其他地方提供的,并且根据用户的不同而有所不同-我的目标是

我有各种各样的课程,例如

<?php

namespace MyApp\Notifications;

class FirstNotification implements NotificationInterface {
    public function getMessage() {
        return 'first message';
    }
}
但这感觉有点粗糙-有没有更好/更标准的方法来做到这一点?数组是在其他地方提供的,并且根据用户的不同而有所不同-我的目标是能够轻松创建实现我的接口的类,并且知道如果这些类存在,这个循环将能够显示它们的消息


理想情况下,我不想为所有类预先添加use语句,也不想将它们传递到构造函数中,我只希望奇迹发生

我假设您实际上不是指自动加载,而是实例化类。自动加载是在应用程序中包含所有文件的过程,以便可以使用内容(通常是类)。如果您使用的是Laravel5,并且遵循PSR-4(名称空间匹配目录结构),则无需做任何事情即可使这些类可用

您已经拥有的代码看起来很好,可能可以正常工作。但是,您可以使用Laravels来解析该类。这有很多优点,一个是自动依赖注入的可用性

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");
}
但是,如果类不存在,这两种情况都会导致异常。您可以事先检查,也可以捕获异常:

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

你提供的代码在我看来实际上相当不错。什么不起作用?(你可能需要在
MyApp
前面加一个反斜杠)我想这感觉有点不对劲-我真的不喜欢使用变量,但也许没有更好的方法。好吧,太棒了-这看起来更正常-你也是对的,我不是指自动加载,而是在需要时自动实例化。谢谢你的帮助!实际上-一个快速的问题-我不认为这个类的缺失是一个例外-所以我宁愿不抛出一个,但做一个IF类首先存在-有一个方法从Appter(),这样做,还是我只会使用一个正常的<代码>如果(类存在(MyApp…)){{} /Cult>语句?不幸的是,容器没有这样的方法。您必须使用
class\u exists
(这不是一个问题或任何东西)
foreach (['First','Second'] as $class_prefix) {
    echo app()->callClass("MyApp\Notifications\\{$class_prefix}Notification@getMessage");
}
foreach (['First','Second'] as $class_prefix) {
    try{
        $object = app()->make("MyApp\Notifications\\{$class_prefix}Notification");
        echo $object->getMessage();
    }
    catch(ReflectionException $e){
        // whooops
    }
}