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
}
}
我有各种类,例如
<?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
}
}