From 5b4b7f540bdaaba71557ffd528319025ebf028d2 Mon Sep 17 00:00:00 2001
From: Jan-Hendrik Willms <tleilax+studip@gmail.com>
Date: Wed, 15 May 2024 20:50:29 +0000
Subject: [PATCH] fixes #4133

Closes #4133

Merge request studip/studip!2978
---
 app/controllers/activityfeed.php              |  4 ++--
 app/controllers/admin/courses.php             | 14 ++++++------
 app/controllers/admin/extern.php              |  2 +-
 app/controllers/admin/sem_classes.php         |  2 +-
 app/controllers/admin/user.php                |  2 +-
 app/controllers/blubber.php                   |  2 +-
 app/controllers/contents/courseware.php       |  2 +-
 app/controllers/course/contentmodules.php     |  2 +-
 app/controllers/course/overview.php           |  2 +-
 app/controllers/course/wiki.php               |  2 +-
 app/controllers/file.php                      | 10 ++++-----
 app/controllers/files.php                     |  6 ++---
 app/controllers/institute/basicdata.php       |  2 +-
 app/controllers/privacy.php                   |  2 +-
 app/controllers/profile.php                   |  2 +-
 app/controllers/profilemodules.php            |  2 +-
 app/controllers/questionnaire.php             |  2 +-
 app/controllers/quickselection.php            |  2 +-
 app/controllers/start.php                     |  4 ++--
 app/views/course/details/index.php            |  2 +-
 app/views/file/add_files_window.php           |  2 +-
 app/views/file/choose_destination.php         |  2 +-
 app/views/institute/overview/index.php        |  2 +-
 .../questionnaire/_overview_questionnaire.php |  2 +-
 app/views/questionnaire/context.php           |  2 +-
 db/migrations/1.154_recalculate_score.php     |  2 +-
 db/migrations/1.314_step_00349.php            |  4 ++--
 lib/archiv.inc.php                            |  2 +-
 lib/classes/JsonApi/RouteMap.php              |  4 ++--
 lib/classes/Metrics.php                       |  2 +-
 lib/classes/MyRealmModel.php                  |  2 +-
 lib/classes/Privacy.php                       |  2 +-
 lib/classes/Score.class.php                   |  2 +-
 lib/classes/Seminar.class.php                 |  2 +-
 lib/classes/Siteinfo.php                      |  4 ++--
 lib/classes/StudipKing.class.php              |  2 +-
 lib/classes/UserManagement.class.php          |  2 +-
 lib/classes/Visibility.php                    |  2 +-
 lib/classes/WidgetHelper.php                  |  2 +-
 lib/extern/ExternPage.php                     |  2 +-
 lib/extern/ExternPagePersonDetails.php        |  2 +-
 lib/filesystem/LibraryFile.class.php          |  2 +-
 lib/models/BlubberThread.php                  |  2 +-
 lib/models/Questionnaire.php                  |  4 ++--
 lib/models/User.class.php                     |  2 +-
 lib/navigation/AdminNavigation.php            |  2 +-
 lib/navigation/ContentsNavigation.php         |  2 +-
 lib/navigation/ProfileNavigation.php          |  2 +-
 lib/navigation/StartNavigation.php            |  2 +-
 lib/plugins/engine/PluginEngine.class.php     | 21 +++++++++---------
 lib/plugins/engine/PluginManager.class.php    | 22 +++++++++----------
 public/api.php                                |  2 +-
 52 files changed, 88 insertions(+), 91 deletions(-)

diff --git a/app/controllers/activityfeed.php b/app/controllers/activityfeed.php
index 2f93aa103d6..8e81912b32f 100644
--- a/app/controllers/activityfeed.php
+++ b/app/controllers/activityfeed.php
@@ -53,7 +53,7 @@ class ActivityfeedController extends AuthenticatedController
         unset($modules[Context::INSTITUTE]['participants']);
         unset($modules[Context::INSTITUTE]['schedule']);
 
-        $standard_plugins = PluginManager::getInstance()->getPlugins("StandardPlugin");
+        $standard_plugins = PluginManager::getInstance()->getPlugins(StandardPlugin::class);
         foreach ($standard_plugins as $plugin) {
             if ($plugin instanceof ActivityProvider) {
                 $modules[Context::COURSE][$plugin->getPluginName()] = $plugin->getPluginName();
@@ -67,7 +67,7 @@ class ActivityfeedController extends AuthenticatedController
             'blubber'      => _('Blubber'),
         ];
 
-        $homepage_plugins = PluginEngine::getPlugins('HomepagePlugin');
+        $homepage_plugins = PluginEngine::getPlugins(HomepagePlugin::class);
         foreach ($homepage_plugins as $plugin) {
             if ($plugin->isActivated($GLOBALS['user']->id, 'user')) {
                 if ($plugin instanceof ActivityProvider) {
diff --git a/app/controllers/admin/courses.php b/app/controllers/admin/courses.php
index 8de1b798499..82c389b7a4d 100644
--- a/app/controllers/admin/courses.php
+++ b/app/controllers/admin/courses.php
@@ -490,7 +490,7 @@ class Admin_CoursesController extends AuthenticatedController
                     ]);
                 break;
             default:
-                foreach (PluginManager::getInstance()->getPlugins('AdminCourseAction') as $plugin) {
+                foreach (PluginManager::getInstance()->getPlugins(AdminCourseAction::class) as $plugin) {
                     if ($GLOBALS['user']->cfg->MY_COURSES_ACTION_AREA === get_class($plugin)) {
                         $multimode = $plugin->useMultimode();
                         if ($multimode) {
@@ -711,7 +711,7 @@ class Admin_CoursesController extends AuthenticatedController
             $d['last_activity_raw'] = $last_activity;
         }
 
-        foreach (PluginManager::getInstance()->getPlugins('AdminCourseContents') as $plugin) {
+        foreach (PluginManager::getInstance()->getPlugins(AdminCourseContents::class) as $plugin) {
             foreach ($plugin->adminAvailableContents() as $index => $label) {
                 if (in_array($plugin->getPluginId() . '_' . $index, $activated_fields)) {
                     $content = $plugin->adminAreaGetCourseContent($course, $index);
@@ -837,7 +837,7 @@ class Admin_CoursesController extends AuthenticatedController
                 $d['action'] = $template->render();
                 break;
             default:
-                foreach (PluginManager::getInstance()->getPlugins('AdminCourseAction') as $plugin) {
+                foreach (PluginManager::getInstance()->getPlugins(AdminCourseAction::class) as $plugin) {
                     if ($GLOBALS['user']->cfg->MY_COURSES_ACTION_AREA === get_class($plugin)) {
                         $output = $plugin->getAdminCourseActionTemplate($course->getId());
                         $d['action'] = $output instanceof Flexi_Template ? $output->render() : (string) $output;
@@ -1029,7 +1029,7 @@ class Admin_CoursesController extends AuthenticatedController
                     $row['institute'] = $course->home_institut ? (string) $course->home_institut['name'] : $course['institut_id'];
                 }
 
-                foreach (PluginManager::getInstance()->getPlugins('AdminCourseContents') as $plugin) {
+                foreach (PluginManager::getInstance()->getPlugins(AdminCourseContents::class) as $plugin) {
                     foreach ($plugin->adminAvailableContents() as $index => $label) {
                         if (in_array($plugin->getPluginId() . "_" . $index, $filter_config)) {
                             $content = $plugin->adminAreaGetCourseContent($course, $index);
@@ -1048,7 +1048,7 @@ class Admin_CoursesController extends AuthenticatedController
             foreach ($filter_config as $index) {
                 $captions[$index] = $view_filters[$index];
             }
-            foreach (PluginManager::getInstance()->getPlugins('AdminCourseContents') as $plugin) {
+            foreach (PluginManager::getInstance()->getPlugins(AdminCourseContents::class) as $plugin) {
                 foreach ($plugin->adminAvailableContents() as $index => $label) {
                     if (in_array($plugin->getPluginId() . "_" . $index, $filter_config)) {
                         $captions[$plugin->getPluginId() . "_" . $index] = $label;
@@ -1446,7 +1446,7 @@ class Admin_CoursesController extends AuthenticatedController
 
         ksort($actions);
 
-        foreach (PluginManager::getInstance()->getPlugins('AdminCourseAction') as $plugin) {
+        foreach (PluginManager::getInstance()->getPlugins(AdminCourseAction::class) as $plugin) {
             $actions[get_class($plugin)] = [
                 'name'      => $plugin->getPluginName(),
                 'title'     => $plugin->getPluginName(),
@@ -1486,7 +1486,7 @@ class Admin_CoursesController extends AuthenticatedController
             'contents'      => _('Inhalt'),
             'last_activity' => _('Letzte Aktivität'),
         ];
-        foreach (PluginManager::getInstance()->getPlugins('AdminCourseContents') as $plugin) {
+        foreach (PluginManager::getInstance()->getPlugins(AdminCourseContents::class) as $plugin) {
             foreach ($plugin->adminAvailableContents() as $index => $label) {
                 $views[$plugin->getPluginId() . "_" . $index] = $label;
             }
diff --git a/app/controllers/admin/extern.php b/app/controllers/admin/extern.php
index 559868e3351..732b5861133 100644
--- a/app/controllers/admin/extern.php
+++ b/app/controllers/admin/extern.php
@@ -440,7 +440,7 @@ class Admin_ExternController extends AuthenticatedController
      */
     protected function fetchPlugins(bool $is_system): void
     {
-        $plugins = PluginEngine::getPlugins('ExternPagePlugin');
+        $plugins = PluginEngine::getPlugins(ExternPagePlugin::class);
         foreach ($plugins as $plugin) {
             if (
                 $is_system === $plugin->isSystemPage()
diff --git a/app/controllers/admin/sem_classes.php b/app/controllers/admin/sem_classes.php
index c0b098f89d8..7993c4b308d 100644
--- a/app/controllers/admin/sem_classes.php
+++ b/app/controllers/admin/sem_classes.php
@@ -65,7 +65,7 @@ class Admin_SemClassesController extends AuthenticatedController
     {
         Navigation::activateItem("/admin/locations/sem_classes");
 
-        $plugins = PluginManager::getInstance()->getPlugins("StudipModule");
+        $plugins = PluginManager::getInstance()->getPlugins(StudipModule::class);
         $this->sem_class = SemClass::getClasses()[Request::get("id")];
         $modules = [];
         foreach ($this->sem_class->getModuleObjects() as $plugin) {
diff --git a/app/controllers/admin/user.php b/app/controllers/admin/user.php
index 214c2908b64..54aa0c489f7 100644
--- a/app/controllers/admin/user.php
+++ b/app/controllers/admin/user.php
@@ -1474,7 +1474,7 @@ class Admin_UserController extends AuthenticatedController
             'details' => "files",
         ];
 
-        foreach (PluginEngine::getPlugins('ForumModule') as $plugin) {
+        foreach (PluginEngine::getPlugins(ForumModule::class) as $plugin) {
             $table     = $plugin->getEntryTableInfo();
             $queries[] = [
                 'desc'  => $plugin->getPluginName() . ' - ' . _("Anzahl der Postings"),
diff --git a/app/controllers/blubber.php b/app/controllers/blubber.php
index 6588014be44..aedf9b64081 100644
--- a/app/controllers/blubber.php
+++ b/app/controllers/blubber.php
@@ -419,7 +419,7 @@ class BlubberController extends AuthenticatedController
 
             PluginManager::getInstance()->setPluginActivated(
                 PluginManager::getInstance()
-                    ->getPlugin('Blubber')
+                    ->getPlugin(Blubber::class)
                     ->getPluginId(),
                 $course->getId(),
                 true
diff --git a/app/controllers/contents/courseware.php b/app/controllers/contents/courseware.php
index f0d502320f6..c1d807f314d 100644
--- a/app/controllers/contents/courseware.php
+++ b/app/controllers/contents/courseware.php
@@ -262,7 +262,7 @@ class Contents_CoursewareController extends CoursewareController
      */
     private function isCoursewareEnabled($course_id): bool
     {
-        $studip_module = PluginManager::getInstance()->getPlugin('CoursewareModule');
+        $studip_module = PluginManager::getInstance()->getPlugin(CoursewareModule::class);
 
         if (!$studip_module || !$studip_module->isActivated($course_id)) {
             return false;
diff --git a/app/controllers/course/contentmodules.php b/app/controllers/course/contentmodules.php
index df397cdf42f..d37d1bb050a 100644
--- a/app/controllers/course/contentmodules.php
+++ b/app/controllers/course/contentmodules.php
@@ -273,7 +273,7 @@ class Course_ContentmodulesController extends AuthenticatedController
     {
         $list = [];
 
-        foreach (PluginEngine::getPlugins('StudipModule') as $plugin) {
+        foreach (PluginEngine::getPlugins(StudipModule::class) as $plugin) {
             if (!$plugin->isActivatableForContext($context)) {
                 continue;
             }
diff --git a/app/controllers/course/overview.php b/app/controllers/course/overview.php
index 402137e9a49..876de5ada18 100644
--- a/app/controllers/course/overview.php
+++ b/app/controllers/course/overview.php
@@ -111,7 +111,7 @@ class Course_OverviewController extends AuthenticatedController
             $this->avatar   = StudygroupAvatar::getAvatar($this->course_id);
         }
 
-        $this->plugins = PluginEngine::getPlugins('StandardPlugin', $this->course_id);
+        $this->plugins = PluginEngine::getPlugins(StandardPlugin::class, $this->course_id);
 
         $sidebar = Sidebar::get();
 
diff --git a/app/controllers/course/wiki.php b/app/controllers/course/wiki.php
index cbd63cf5c0f..0bb6c717b25 100644
--- a/app/controllers/course/wiki.php
+++ b/app/controllers/course/wiki.php
@@ -18,7 +18,7 @@ class Course_WikiController extends AuthenticatedController
         parent::before_filter($action, $args);
         object_set_visit_module('wiki');
         $this->range = Context::get();
-        $this->plugin = PluginManager::getInstance()->getPlugin('CoreWiki');
+        $this->plugin = PluginManager::getInstance()->getPlugin(CoreWiki::class);
 
         PageLayout::setTitle(Navigation::getItem('/course/wiki')->getTitle());
     }
diff --git a/app/controllers/file.php b/app/controllers/file.php
index bebfe70ebf8..11b1949f7d0 100644
--- a/app/controllers/file.php
+++ b/app/controllers/file.php
@@ -1103,7 +1103,7 @@ class FileController extends AuthenticatedController
                     return;
                 }
 
-                $this->library_plugins = $plugin_manager->getPlugins('LibraryPlugin');
+                $this->library_plugins = $plugin_manager->getPlugins(LibraryPlugin::class);
 
                 //Build the query parameter array:
                 $search_parameters = [];
@@ -1182,7 +1182,7 @@ class FileController extends AuthenticatedController
                 );
             }
         } elseif (Request::get('search_id')) {
-            $this->library_plugins = $plugin_manager->getPlugins('LibraryPlugin');
+            $this->library_plugins = $plugin_manager->getPlugins(LibraryPlugin::class);
 
             $this->search_id = Request::get('search_id');
             $this->page = Request::get('page');
@@ -1462,7 +1462,7 @@ class FileController extends AuthenticatedController
                 $this->current_folder = $this->to_folder_type;
                 $this->marked_element_ids = [];
 
-                $plugins = PluginManager::getInstance()->getPlugins('FileUploadHook');
+                $plugins = PluginManager::getInstance()->getPlugins(FileUploadHook::class);
 
                 $redirects = [];
                 foreach ($plugins as $plugin) {
@@ -1685,7 +1685,7 @@ class FileController extends AuthenticatedController
                         );
                     }
 
-                    $plugins = PluginManager::getInstance()->getPlugins('FileUploadHook');
+                    $plugins = PluginManager::getInstance()->getPlugins(FileUploadHook::class);
                     $redirect = null;
                     foreach ($plugins as $upload_hook_plugin) {
                         $url = $upload_hook_plugin->getAdditionalUploadWizardPage($file_ref);
@@ -1820,7 +1820,7 @@ class FileController extends AuthenticatedController
 
                     $payload['html'][] = FilesystemVueDataManager::getFileVueData($this->file, $this->top_folder);
 
-                    $plugins = PluginManager::getInstance()->getPlugins('FileUploadHook');
+                    $plugins = PluginManager::getInstance()->getPlugins(FileUploadHook::class);
 
                     $redirects = [];
                     foreach ($plugins as $plugin) {
diff --git a/app/controllers/files.php b/app/controllers/files.php
index 3c77f4e50d7..2d4de4e1593 100644
--- a/app/controllers/files.php
+++ b/app/controllers/files.php
@@ -68,7 +68,7 @@ class FilesController extends AuthenticatedController
             $this->url_for("files/index"),
             Icon::create("files", "clickable")
         );
-        foreach (PluginManager::getInstance()->getPlugins('FilesystemPlugin') as $plugin) {
+        foreach (PluginManager::getInstance()->getPlugins(FilesystemPlugin::class) as $plugin) {
             if ($plugin->isPersonalFileArea()) {
                 $subnav = $plugin->getFileSelectNavigation();
                 $sources->addLink(
@@ -110,7 +110,7 @@ class FilesController extends AuthenticatedController
         }
 
         $config_urls = [];
-        foreach (PluginManager::getInstance()->getPlugins('FilesystemPlugin') as $plugin) {
+        foreach (PluginManager::getInstance()->getPlugins(FilesystemPlugin::class) as $plugin) {
             $url = $plugin->filesystemConfigurationURL();
             if ($url) {
                 $navigation = $plugin->getFileSelectNavigation();
@@ -647,7 +647,7 @@ class FilesController extends AuthenticatedController
         PageLayout::setTitle(_('Dateibereich zur Konfiguration auswählen'));
 
         $this->configure_urls = [];
-        foreach (PluginManager::getInstance()->getPlugins('FilesystemPlugin') as $plugin) {
+        foreach (PluginManager::getInstance()->getPlugins(FilesystemPlugin::class) as $plugin) {
             $url = $plugin->filesystemConfigurationURL();
             if ($url) {
                 $navigation = $plugin->getFileSelectNavigation();
diff --git a/app/controllers/institute/basicdata.php b/app/controllers/institute/basicdata.php
index fb1ce9652b9..9c800fdbbaa 100644
--- a/app/controllers/institute/basicdata.php
+++ b/app/controllers/institute/basicdata.php
@@ -435,7 +435,7 @@ class Institute_BasicdataController extends AuthenticatedController
             }
 
             // delete all contents in forum-modules
-            foreach (PluginEngine::getPlugins('ForumModule') as $plugin) {
+            foreach (PluginEngine::getPlugins(ForumModule::class) as $plugin) {
                 $plugin->deleteContents($i_id);  // delete content irrespective of plugin-activation in the seminar
                 if ($plugin->isActivated($i_id)) {   // only show a message, if the plugin is activated, to not confuse the user
                     $details[] = sprintf(_('Einträge in %s gelöscht.'), $plugin->getPluginName());
diff --git a/app/controllers/privacy.php b/app/controllers/privacy.php
index ba8e6f1a004..d50b1f1bd1d 100644
--- a/app/controllers/privacy.php
+++ b/app/controllers/privacy.php
@@ -305,7 +305,7 @@ class PrivacyController extends AuthenticatedController
             $storage->addFileRef($fileref);
         }
 
-        foreach (PluginEngine::getPlugins('PrivacyPlugin') as $plugin) {
+        foreach (PluginEngine::getPlugins(PrivacyPlugin::class) as $plugin) {
             $plugin->exportUserData($storage);
         }
 
diff --git a/app/controllers/profile.php b/app/controllers/profile.php
index 3fa37772836..b9a7cf73710 100644
--- a/app/controllers/profile.php
+++ b/app/controllers/profile.php
@@ -210,7 +210,7 @@ class ProfileController extends AuthenticatedController
         }
 
         // Hompageplugins
-        $homepageplugins = PluginEngine::getPlugins('HomepagePlugin');
+        $homepageplugins = PluginEngine::getPlugins(HomepagePlugin::class);
 
         $render = '';
         $layout = $GLOBALS['template_factory']->open('shared/content_box');
diff --git a/app/controllers/profilemodules.php b/app/controllers/profilemodules.php
index 201c4ffaab2..c24d4f413bb 100644
--- a/app/controllers/profilemodules.php
+++ b/app/controllers/profilemodules.php
@@ -106,7 +106,7 @@ class ProfileModulesController extends AuthenticatedController
         $plugins = [];
 
         // Get homepage plugins from database.
-        foreach (PluginEngine::getPlugins('HomepagePlugin') as $plugin) {
+        foreach (PluginEngine::getPlugins(HomepagePlugin::class) as $plugin) {
             if ($plugin->isActivatableForContext($this->user)) {
                 $plugins[$plugin->getPluginId()] = $plugin;
             }
diff --git a/app/controllers/questionnaire.php b/app/controllers/questionnaire.php
index 6f805260300..4016b9dd04e 100644
--- a/app/controllers/questionnaire.php
+++ b/app/controllers/questionnaire.php
@@ -493,7 +493,7 @@ class QuestionnaireController extends AuthenticatedController
                 $course_assignment['user_id'] = $GLOBALS['user']->id;
                 $course_assignment->store();
             }
-            foreach (PluginManager::getInstance()->getPlugins("QuestionnaireAssignmentPlugin") as $plugin) {
+            foreach (PluginManager::getInstance()->getPlugins(QuestionnaireAssignmentPlugin::class) as $plugin) {
                 $plugin->storeQuestionnaireAssignments($this->questionnaire);
             }
 
diff --git a/app/controllers/quickselection.php b/app/controllers/quickselection.php
index 1899e539d9b..a53eb080666 100644
--- a/app/controllers/quickselection.php
+++ b/app/controllers/quickselection.php
@@ -27,7 +27,7 @@ class QuickselectionController extends AuthenticatedController
 
         UserConfig::get($GLOBALS['user']->id)->store('QUICK_SELECTION', $names);
 
-        $template = PluginEngine::getPlugin('QuickSelection')->getPortalTemplate();
+        $template = PluginEngine::getPlugin(QuickSelection::class)->getPortalTemplate();
 
         $this->response->add_header('X-Dialog-Close', 1);
         $this->response->add_header('X-Dialog-Execute', 'STUDIP.QuickSelection.update');
diff --git a/app/controllers/start.php b/app/controllers/start.php
index 53a87dc796a..87c493e9406 100644
--- a/app/controllers/start.php
+++ b/app/controllers/start.php
@@ -132,7 +132,7 @@ class StartController extends AuthenticatedController
      */
     private function getAvailableWidgets($user_id)
     {
-        $all_widgets = PluginEngine::getPlugins('PortalPlugin');
+        $all_widgets = PluginEngine::getPlugins(PortalPlugin::class);
         $user_widgets = WidgetUser::getWidgets($user_id);
         $used_widgets = array_merge(...$user_widgets);
         $available = [];
@@ -190,7 +190,7 @@ class StartController extends AuthenticatedController
 
         PageLayout::setTitle(sprintf(_('Standard-Startseite für "%s" bearbeiten'), ucfirst($permission)));
 
-        $this->widgets = PluginEngine::getPlugins('PortalPlugin');
+        $this->widgets = PluginEngine::getPlugins(PortalPlugin::class);
         $this->initial_widgets = WidgetDefault::getWidgets($permission);
         $this->permission = $permission;
     }
diff --git a/app/views/course/details/index.php b/app/views/course/details/index.php
index eb7da10f308..545454a26ac 100644
--- a/app/views/course/details/index.php
+++ b/app/views/course/details/index.php
@@ -496,7 +496,7 @@ if (!empty($mvv_tree)) : ?>
     </article>
 <? endif ?>
 
-<? foreach (PluginManager::getInstance()->getPlugins('DetailspagePlugin') as $plugin) : ?>
+<? foreach (PluginManager::getInstance()->getPlugins(DetailspagePlugin::class) as $plugin) : ?>
     <? $template = $plugin->getDetailspageTemplate($course) ?>
     <? if ($template) : ?>
         <article class="studip">
diff --git a/app/views/file/add_files_window.php b/app/views/file/add_files_window.php
index 53a7b73f627..c7630c50f0c 100644
--- a/app/views/file/add_files_window.php
+++ b/app/views/file/add_files_window.php
@@ -69,7 +69,7 @@ if ($folder_id) {
                     <?= _('OER Campus') ?>
                 </a>
             <? endif ?>
-            <? foreach (PluginManager::getInstance()->getPlugins('FilesystemPlugin') as $plugin) : ?>
+            <? foreach (PluginManager::getInstance()->getPlugins(FilesystemPlugin::class) as $plugin) : ?>
                 <? if ($plugin->isSource()) : ?>
                     <? $nav = $plugin->getFileSelectNavigation() ?>
                     <? if ($nav): ?>
diff --git a/app/views/file/choose_destination.php b/app/views/file/choose_destination.php
index 49afe8769c3..9a398837adc 100644
--- a/app/views/file/choose_destination.php
+++ b/app/views/file/choose_destination.php
@@ -64,7 +64,7 @@ $options = array_filter([
                 </button>
             </div>
 
-        <? foreach (PluginManager::getInstance()->getPlugins('FilesystemPlugin') as $plugin) : ?>
+        <? foreach (PluginManager::getInstance()->getPlugins(FilesystemPlugin::class) as $plugin) : ?>
             <? if ($plugin->isPersonalFileArea()) : ?>
                 <? $nav = $plugin->getFileSelectNavigation() ?>
                 <? if ($nav) : ?>
diff --git a/app/views/institute/overview/index.php b/app/views/institute/overview/index.php
index 3e80f98f481..7ed85460c46 100644
--- a/app/views/institute/overview/index.php
+++ b/app/views/institute/overview/index.php
@@ -54,7 +54,7 @@
 
 <?
 // display plugins
-$plugins = PluginEngine::getPlugins('StandardPlugin', $institute_id);
+$plugins = PluginEngine::getPlugins(StandardPlugin::class, $institute_id);
 $layout = $GLOBALS['template_factory']->open('shared/index_box');
 
 foreach ($plugins as $plugin) {
diff --git a/app/views/questionnaire/_overview_questionnaire.php b/app/views/questionnaire/_overview_questionnaire.php
index bb7586ef853..8b45d422fe8 100644
--- a/app/views/questionnaire/_overview_questionnaire.php
+++ b/app/views/questionnaire/_overview_questionnaire.php
@@ -51,7 +51,7 @@
                 <?= htmlReady(Institute::find($assignment['range_id'])->name) ?>
             <? else : ?>
                 <?
-                foreach (PluginManager::getInstance()->getPlugins("QuestionnaireAssignmentPlugin") as $plugin) {
+                foreach (PluginManager::getInstance()->getPlugins(QuestionnaireAssignmentPlugin::class) as $plugin) {
                     $name = $plugin->getQuestionnaireAssignmentName($assignment);
                     if ($name) {
                         echo htmlReady($name);
diff --git a/app/views/questionnaire/context.php b/app/views/questionnaire/context.php
index 3237101c851..98e08c0bd90 100644
--- a/app/views/questionnaire/context.php
+++ b/app/views/questionnaire/context.php
@@ -93,7 +93,7 @@
         <? endif ?>
 
         <?
-        foreach (PluginManager::getInstance()->getPlugins("QuestionnaireAssignmentPlugin") as $plugin) {
+        foreach (PluginManager::getInstance()->getPlugins(QuestionnaireAssignmentPlugin::class) as $plugin) {
             $template = $plugin->getQuestionnaireAssignmentEditTemplate($this->questionnaire);
             if ($template) {
                 echo $template->render();
diff --git a/db/migrations/1.154_recalculate_score.php b/db/migrations/1.154_recalculate_score.php
index 5568363ea30..9391e7d4109 100644
--- a/db/migrations/1.154_recalculate_score.php
+++ b/db/migrations/1.154_recalculate_score.php
@@ -130,7 +130,7 @@ class RecalculateScore extends Migration {
             'date_column' => "chdate"
         ];
 
-        foreach (PluginManager::getInstance()->getPlugins("ScorePlugin") as $plugin) {
+        foreach (PluginManager::getInstance()->getPlugins(ScorePlugin::class) as $plugin) {
             foreach ((array) $plugin->getPluginActivityTables() as $table) {
                 if ($table['table']) {
                     $tables[] = $table;
diff --git a/db/migrations/1.314_step_00349.php b/db/migrations/1.314_step_00349.php
index a777cc29470..a1094d8fc9c 100644
--- a/db/migrations/1.314_step_00349.php
+++ b/db/migrations/1.314_step_00349.php
@@ -98,8 +98,8 @@ class Step00349 extends Migration
             'participants' => 'CoreParticipants',
             'courseware' => 'CoursewareModule'
         ];
-        PluginManager::getInstance()->getPlugin('CoreForum');
-        PluginManager::getInstance()->getPlugin('Blubber');
+        PluginManager::getInstance()->getPlugin(CoreForum::class);
+        PluginManager::getInstance()->getPlugin(Blubber::class);
 
         foreach ($core_plugins as $plugin) {
             try {
diff --git a/lib/archiv.inc.php b/lib/archiv.inc.php
index 8fe4bc950e7..e40685f612e 100644
--- a/lib/archiv.inc.php
+++ b/lib/archiv.inc.php
@@ -64,7 +64,7 @@ function lastActivity ($sem_id)
                           WHERE `range_id` = :id";
         }
 
-        foreach (PluginEngine::getPlugins('ForumModule') as $plugin) {
+        foreach (PluginEngine::getPlugins(ForumModule::class) as $plugin) {
             $table = $plugin->getEntryTableInfo();
             $queries[] = 'SELECT MAX(`'. $table['chdate'] .'`) AS chdate FROM `'. $table['table'] .'` WHERE `'. $table['seminar_id'] .'` = :id';
         }
diff --git a/lib/classes/JsonApi/RouteMap.php b/lib/classes/JsonApi/RouteMap.php
index 4f441651ba7..d81bbbf100b 100644
--- a/lib/classes/JsonApi/RouteMap.php
+++ b/lib/classes/JsonApi/RouteMap.php
@@ -122,7 +122,7 @@ class RouteMap
         $this->addAuthenticatedContactsRoutes($group);
         $this->addAuthenticatedCoursesRoutes($group);
 
-        if (\PluginManager::getInstance()->getPlugin('CoursewareModule')) {
+        if (\PluginManager::getInstance()->getPlugin(\CoursewareModule::class)) {
             $this->addAuthenticatedCoursewareRoutes($group);
         }
 
@@ -155,7 +155,7 @@ class RouteMap
 
         $group->get('/studip/properties', Routes\Studip\PropertiesIndex::class);
 
-        if (\PluginManager::getInstance()->getPlugin('CoursewareModule')) {
+        if (\PluginManager::getInstance()->getPlugin(\CoursewareModule::class)) {
             $group->get('/public/courseware/{link_id}/courseware-structural-elements/{id}', Routes\Courseware\PublicStructuralElementsShow::class);
             $group->get('/public/courseware/{link_id}/courseware-structural-elements', Routes\Courseware\PublicStructuralElementsIndex::class);
         }
diff --git a/lib/classes/Metrics.php b/lib/classes/Metrics.php
index c3874d5d4a1..e6a2925df75 100644
--- a/lib/classes/Metrics.php
+++ b/lib/classes/Metrics.php
@@ -191,7 +191,7 @@ class Metrics {
 
         // cache the activated MetricsPlugins
         if (!self::$metricPlugins) {
-            self::$metricPlugins = \PluginEngine::getPlugins('MetricsPlugin');
+            self::$metricPlugins = \PluginEngine::getPlugins(MetricsPlugin::class);
         }
 
         // call every MetricPlugin
diff --git a/lib/classes/MyRealmModel.php b/lib/classes/MyRealmModel.php
index ab9aa20877e..8997e780bef 100644
--- a/lib/classes/MyRealmModel.php
+++ b/lib/classes/MyRealmModel.php
@@ -475,7 +475,7 @@ class MyRealmModel
     public static function setObjectVisits($object, $user_id, $timestamp = null)
     {
         // load plugins, so they have a chance to register themselves as observers
-        PluginEngine::getPlugins('StandardPlugin');
+        PluginEngine::getPlugins(StandardPlugin::class);
 
         // Update news and votes
         $query = "INSERT INTO object_user_visits
diff --git a/lib/classes/Privacy.php b/lib/classes/Privacy.php
index 0ba296a52c3..b38838ccc0d 100644
--- a/lib/classes/Privacy.php
+++ b/lib/classes/Privacy.php
@@ -114,7 +114,7 @@ class Privacy
         }
 
         if (!$section || $section === 'plugins') {
-            foreach (PluginEngine::getPlugins('PrivacyPlugin') as $plugin) {
+            foreach (PluginEngine::getPlugins(PrivacyPlugin::class) as $plugin) {
                 $plugin->exportUserData($storage);
             }
         }
diff --git a/lib/classes/Score.class.php b/lib/classes/Score.class.php
index f7d8ea34271..4d114d5d4b5 100644
--- a/lib/classes/Score.class.php
+++ b/lib/classes/Score.class.php
@@ -212,7 +212,7 @@ class Score
             'date_column' => 'chdate'
         ];
 
-        foreach (PluginManager::getInstance()->getPlugins('ScorePlugin') as $plugin) {
+        foreach (PluginManager::getInstance()->getPlugins(ScorePlugin::class) as $plugin) {
             foreach ((array) $plugin->getPluginActivityTables() as $table) {
                 if ($table['table']) {
                     $tables[] = $table;
diff --git a/lib/classes/Seminar.class.php b/lib/classes/Seminar.class.php
index dda25ee0ffd..8aa3d412b75 100644
--- a/lib/classes/Seminar.class.php
+++ b/lib/classes/Seminar.class.php
@@ -1565,7 +1565,7 @@ class Seminar
         SeminarCycleDate::deleteBySQL('seminar_id = ' . DBManager::get()->quote($s_id));
 
         // Alle weiteren Postings zu diesem Seminar in den Forums-Modulen löschen
-        foreach (PluginEngine::getPlugins('ForumModule') as $plugin) {
+        foreach (PluginEngine::getPlugins(ForumModule::class) as $plugin) {
             $plugin->deleteContents($s_id);  // delete content irrespective of plugin-activation in the seminar
 
             if ($plugin->isActivated($s_id)) {   // only show a message, if the plugin is activated, to not confuse the user
diff --git a/lib/classes/Siteinfo.php b/lib/classes/Siteinfo.php
index 9043ce36db8..0d849ca07d9 100644
--- a/lib/classes/Siteinfo.php
+++ b/lib/classes/Siteinfo.php
@@ -480,7 +480,7 @@ class SiteinfoMarkupEngine {
                 // get TopTen of seminars from all ForumModules and add up the
                 // count for seminars with more than one active ForumModule
                 // to get a combined toplist
-                foreach (PluginEngine::getPlugins('ForumModule') as $plugin) {
+                foreach (PluginEngine::getPlugins(ForumModule::class) as $plugin) {
                     $new_seminars = $plugin->getTopTenSeminars();
                     foreach ($new_seminars as $sem) {
                         if (!isset($seminars[$sem['seminar_id']])) {
@@ -589,7 +589,7 @@ class SiteinfoMarkupEngine {
             $count = 0;
 
             // sum up number of postings for all availabe ForumModules
-            foreach (PluginEngine::getPlugins('ForumModule') as $plugin) {
+            foreach (PluginEngine::getPlugins(ForumModule::class) as $plugin) {
                 $count += $plugin->getNumberOfPostings();
             }
 
diff --git a/lib/classes/StudipKing.class.php b/lib/classes/StudipKing.class.php
index 3a61c577f98..ae5a14e7686 100644
--- a/lib/classes/StudipKing.class.php
+++ b/lib/classes/StudipKing.class.php
@@ -118,7 +118,7 @@ class StudipKing {
         $kings = [];
 
         // sum up postings for all users from all ForumModules available
-        foreach (PluginEngine::getPlugins('ForumModule') as $plugin) {
+        foreach (PluginEngine::getPlugins(ForumModule::class) as $plugin) {
             $table = $plugin->getEntryTableInfo();
             $query = "SELECT user_id AS id, COUNT(*) AS num FROM ". $table['table'] ." GROUP BY user_id";
             $new_kings = self::select_kings($query);
diff --git a/lib/classes/UserManagement.class.php b/lib/classes/UserManagement.class.php
index 780559415e4..015e6cd491a 100644
--- a/lib/classes/UserManagement.class.php
+++ b/lib/classes/UserManagement.class.php
@@ -898,7 +898,7 @@ class UserManagement
 
         // Load privacy plugins to ensure all event handlers can react to the
         // UserDataDidRemove event
-        PluginEngine::getPlugins('PrivacyPlugin');
+        PluginEngine::getPlugins(PrivacyPlugin::class);
 
         // delete user from instituts
         $this->logInstUserDel($this->user_data['auth_user_md5.user_id']);
diff --git a/lib/classes/Visibility.php b/lib/classes/Visibility.php
index 1b872301152..99b3907e4fd 100644
--- a/lib/classes/Visibility.php
+++ b/lib/classes/Visibility.php
@@ -614,7 +614,7 @@ class Visibility
     private function createHomepagePluginEntries($user)
     {
         self::getUser($user);
-        $homepageplugins = PluginEngine::getPlugins('HomepagePlugin');
+        $homepageplugins = PluginEngine::getPlugins(HomepagePlugin::class);
         foreach ($homepageplugins as $plugin) {
             self::addPrivacySetting($plugin->getPluginName(), ("plugin".$plugin->getPluginId()), 'plugins', 1, $user, null, $plugin->getPluginId());
         }
diff --git a/lib/classes/WidgetHelper.php b/lib/classes/WidgetHelper.php
index ba82ee9a1dc..ff4d7a61268 100644
--- a/lib/classes/WidgetHelper.php
+++ b/lib/classes/WidgetHelper.php
@@ -348,7 +348,7 @@ class WidgetHelper
      */
     public static function getAvailableWidgets($user_id = null)
     {
-        $all_widgets = PluginEngine::getPlugins('PortalPlugin');
+        $all_widgets = PluginEngine::getPlugins(PortalPlugin::class);
 
         $used_widgets = is_null($user_id)
                 ? []
diff --git a/lib/extern/ExternPage.php b/lib/extern/ExternPage.php
index 308caebad8b..d3c5ec2cdf6 100644
--- a/lib/extern/ExternPage.php
+++ b/lib/extern/ExternPage.php
@@ -110,7 +110,7 @@ abstract class ExternPage
         $page_name = 'ExternPage' . $config->type;
         if (!class_exists($page_name)) {
             // lookup plugins
-            $plugins = PluginEngine::getPlugins('ExternPagePlugin');
+            $plugins = PluginEngine::getPlugins(ExternPagePlugin::class);
             foreach ($plugins as $plugin) {
                 if ($config->type === $plugin->getExternPageName()) {
                     return $plugin->getExternPage($config);
diff --git a/lib/extern/ExternPagePersonDetails.php b/lib/extern/ExternPagePersonDetails.php
index 49c754c16a1..8fb65404404 100644
--- a/lib/extern/ExternPagePersonDetails.php
+++ b/lib/extern/ExternPagePersonDetails.php
@@ -439,7 +439,7 @@ class ExternPagePersonDetails extends ExternPage
     private function getContentHomepagePlugins(User $user)
     {
         $content = [];
-        $plugins = PluginEngine::getPlugins('HomepagePlugin');
+        $plugins = PluginEngine::getPlugins(HomepagePlugin::class);
         foreach ($plugins as $plugin) {
             $template = $plugin->getHomepageTemplate($user->id);
             if ($template) {
diff --git a/lib/filesystem/LibraryFile.class.php b/lib/filesystem/LibraryFile.class.php
index 0c2bcb68b89..c9524e32cae 100644
--- a/lib/filesystem/LibraryFile.class.php
+++ b/lib/filesystem/LibraryFile.class.php
@@ -212,7 +212,7 @@ class LibraryFile extends StandardFile
         );
         if (Config::get()->LITERATURE_ENABLE && Context::get() && $GLOBALS['perm']->have_studip_perm('tutor', Context::getId())) {
             $plugin_manager = PluginManager::getInstance();
-            $library_plugins = $plugin_manager->getPlugins('LibraryPlugin');
+            $library_plugins = $plugin_manager->getPlugins(LibraryPlugin::class);
             if (count($library_plugins)) {
                 $plugin = $library_plugins[0];
                 $action_menu->addLink(
diff --git a/lib/models/BlubberThread.php b/lib/models/BlubberThread.php
index aa6016fc461..590a600e4a8 100644
--- a/lib/models/BlubberThread.php
+++ b/lib/models/BlubberThread.php
@@ -1081,7 +1081,7 @@ class BlubberThread extends SimpleORMap implements PrivacyObject
                   FROM user_inst
                   WHERE user_id = ?";
         $institut_ids = DBManager::get()->fetchFirst($query, [$user_id]);
-        $blubberplugin = PluginManager::getInstance()->getPlugin("Blubber");
+        $blubberplugin = PluginManager::getInstance()->getPlugin(Blubber::class);
         if (!$blubberplugin) {
             return [];
         }
diff --git a/lib/models/Questionnaire.php b/lib/models/Questionnaire.php
index f29a2de7f1b..777182d4733 100644
--- a/lib/models/Questionnaire.php
+++ b/lib/models/Questionnaire.php
@@ -129,7 +129,7 @@ class Questionnaire extends SimpleORMap implements PrivacyObject
                 return true;
             } else {
                 //now look through all plugin if this assignment is related to plugin contents:
-                foreach (PluginManager::getInstance()->getPlugins("QuestionnaireAssignmentPlugin") as $plugin) {
+                foreach (PluginManager::getInstance()->getPlugins(QuestionnaireAssignmentPlugin::class) as $plugin) {
                     if ($plugin->isQuestionnaireViewable($assignment)) {
                         return true;
                     }
@@ -172,7 +172,7 @@ class Questionnaire extends SimpleORMap implements PrivacyObject
                     return true;
                 } else {
                     //now look through all plugin if this assignment is related to plugin contents:
-                    foreach (PluginManager::getInstance()->getPlugins("QuestionnaireAssignmentPlugin") as $plugin) {
+                    foreach (PluginManager::getInstance()->getPlugins(QuestionnaireAssignmentPlugin::class) as $plugin) {
                         if ($plugin->isQuestionnaireEditable($assignment)) {
                             return true;
                         }
diff --git a/lib/models/User.class.php b/lib/models/User.class.php
index b71464cf3d2..a9dbc14d4a3 100644
--- a/lib/models/User.class.php
+++ b/lib/models/User.class.php
@@ -1189,7 +1189,7 @@ class User extends AuthUserMd5 implements Range, PrivacyObject, Studip\Calendar\
         // Restliche Daten übertragen
 
         // ForumsModule migrieren
-        foreach (PluginEngine::getPlugins('ForumModule') as $plugin) {
+        foreach (PluginEngine::getPlugins(ForumModule::class) as $plugin) {
             $plugin->migrateUser($old_id, $new_id);
         }
 
diff --git a/lib/navigation/AdminNavigation.php b/lib/navigation/AdminNavigation.php
index a1762c67425..a72508228c1 100644
--- a/lib/navigation/AdminNavigation.php
+++ b/lib/navigation/AdminNavigation.php
@@ -126,7 +126,7 @@ class AdminNavigation extends Navigation
                 $navigation->addSubNavigation('banner', new Navigation(_('Werbebanner'), 'dispatch.php/admin/banner'));
             }
 
-            if (PluginManager::getInstance()->getPlugin('CoursewareModule')) {
+            if (PluginManager::getInstance()->getPlugin(CoursewareModule::class)) {
                 $navigation->addSubNavigation(
                     'courseware',
                     new Navigation(
diff --git a/lib/navigation/ContentsNavigation.php b/lib/navigation/ContentsNavigation.php
index f6190e2f3e9..a00adb6e07a 100644
--- a/lib/navigation/ContentsNavigation.php
+++ b/lib/navigation/ContentsNavigation.php
@@ -42,7 +42,7 @@ class ContentsNavigation extends Navigation
 
         $this->addSubNavigation('overview', $overview);
 
-        if (PluginManager::getInstance()->getPlugin('CoursewareModule')) {
+        if (PluginManager::getInstance()->getPlugin(CoursewareModule::class)) {
             $courseware = new Navigation(_('Courseware'));
             $courseware->setDescription(_('Erstellen und Sammeln von Lernmaterialien'));
             $courseware->setImage(Icon::create('courseware'));
diff --git a/lib/navigation/ProfileNavigation.php b/lib/navigation/ProfileNavigation.php
index 50dcfec2d9b..4827fe4db35 100644
--- a/lib/navigation/ProfileNavigation.php
+++ b/lib/navigation/ProfileNavigation.php
@@ -139,7 +139,7 @@ class ProfileNavigation extends Navigation
 
         // Add consultations if appropriate
         if (Config::get()->CONSULTATION_ENABLED) {
-            $plugin = PluginEngine::getPlugin('ConsultationModule');
+            $plugin = PluginEngine::getPlugin(ConsultationModule::class);
             if ($current_user && $plugin && PluginManager::getInstance()->isPluginActivatedForUser($plugin->getPluginId(), $current_user->id)) {
                 $this->addSubNavigation('consultation', new ConsultationNavigation($current_user));
             }
diff --git a/lib/navigation/StartNavigation.php b/lib/navigation/StartNavigation.php
index acd5ee32d60..0a6d52afa40 100644
--- a/lib/navigation/StartNavigation.php
+++ b/lib/navigation/StartNavigation.php
@@ -222,7 +222,7 @@ class StartNavigation extends Navigation
         // contents
         $navigation = new Navigation(_('Mein Arbeitsplatz'), 'dispatch.php/contents/overview');
 
-        if (PluginManager::getInstance()->getPlugin('CoursewareModule')) {
+        if (PluginManager::getInstance()->getPlugin(CoursewareModule::class)) {
             $navigation->addSubNavigation('courseware',
                 new Navigation(_('Courseware'), 'dispatch.php/contents/courseware'));
         }
diff --git a/lib/plugins/engine/PluginEngine.class.php b/lib/plugins/engine/PluginEngine.class.php
index ecf00cff790..25974c50631 100644
--- a/lib/plugins/engine/PluginEngine.class.php
+++ b/lib/plugins/engine/PluginEngine.class.php
@@ -3,8 +3,7 @@
 /**
  * Factory Class for the plugin engine
  * @author Dennis Reil, <dennis.reil@offis.de>
- * @package pluginengine
- * @subpackage engine
+ * @template P of StudIPPlugin
  */
 
 class PluginEngine
@@ -38,27 +37,28 @@ class PluginEngine
         global $user, $perm;
 
         // load system plugins
-        self::getPlugins('SystemPlugin');
+        self::getPlugins(SystemPlugin::class);
 
         // load homepage plugins
-        self::getPlugins('HomepagePlugin');
+        self::getPlugins(HomepagePlugin::class);
 
         // load course plugins
         if (Context::getId()) {
-            self::getPlugins('StudipModule');
-            self::getPlugins('StandardPlugin');
+            self::getPlugins(StudipModule::class);
+            self::getPlugins(StandardPlugin::class);
         }
 
         // load admin plugins
         if (is_object($user) && $perm->have_perm('admin')) {
-            self::getPlugins('AdministrationPlugin');
+            self::getPlugins(AdministrationPlugin::class);
         }
     }
 
     /**
      * Get instance of the plugin specified by plugin class name.
      *
-     * @param string $class class name of plugin
+     * @param class-string<P> $class class name of plugin
+     * @return P
      */
     public static function getPlugin ($class)
     {
@@ -70,10 +70,9 @@ class PluginEngine
      * returns all enabled plugins. The optional context parameter can be
      * used to get only plugins that are activated in the given context.
      *
-     * @template T
-     * @param T $type plugin type or null (all types)
+     * @param class-string<P>|null $type plugin type or null (all types)
      * @param string $context context range id (optional)
-     * @return T[] all plugins of the specified type
+     * @return P[]|StudIPPlugin[] all plugins of the specified type
      */
     public static function getPlugins ($type, $context = null)
     {
diff --git a/lib/plugins/engine/PluginManager.class.php b/lib/plugins/engine/PluginManager.class.php
index f08b5fa4064..fc81d7f36ef 100644
--- a/lib/plugins/engine/PluginManager.class.php
+++ b/lib/plugins/engine/PluginManager.class.php
@@ -1,14 +1,11 @@
 <?php
-# Lifter010: TODO
-/*
+/**
  * PluginManager.class.php - plugin manager for Stud.IP
  *
- * Copyright (c) 2009  Elmar Ludwig
+ * @copyright  2009  Elmar Ludwig
+ * @license GPL2 or any later version
  *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
+ * @template P of StudIPPlugin
  */
 
 class PluginManager
@@ -576,7 +573,7 @@ class PluginManager
      * Get instance of the plugin specified by plugin meta data.
      *
      * @param array $plugin_info plugin meta data
-     * @return object
+     * @return P
      */
     protected function getCachedPlugin ($plugin_info)
     {
@@ -603,8 +600,8 @@ class PluginManager
     /**
      * Get instance of the plugin specified by plugin class name.
      *
-     * @param string $class class name of plugin
-     * @return object
+     * @param class-string<P> $class class name of plugin
+     * @return P|null
      */
     public function getPlugin ($class)
     {
@@ -623,7 +620,7 @@ class PluginManager
      * Get instance of the plugin specified by plugin id.
      *
      * @param int $id id of the plugin
-     * @return object $plugin
+     * @return P|null $plugin
      */
     public function getPluginById ($id)
     {
@@ -643,8 +640,9 @@ class PluginManager
      * returns all enabled plugins. The optional context parameter can be
      * used to get only plugins that are activated in the given context.
      *
-     * @param string $type plugin type or null (all types)
+     * @param class-string<P>|null $type plugin type or null (all types)
      * @param string $context context range id (optional)
+     * @return P[]|StudIPPlugin[]
      */
     public function getPlugins ($type, $context = null)
     {
diff --git a/public/api.php b/public/api.php
index b2d30fa2351..9f7863c60ed 100644
--- a/public/api.php
+++ b/public/api.php
@@ -43,7 +43,7 @@ namespace RESTAPI {
         require 'lib/bootstrap-api.php';
 
         // Initialize RESTAPI plugins
-        \PluginEngine::getPlugins('RESTAPIPlugin');
+        \PluginEngine::getPlugins(RESTAPIPlugin::class);
 
         $uri = \Request::pathInfo();
 
-- 
GitLab