反射(Reflection)是 PHP 強大的中繼程式設計功能,允許執行時檢查類別、介面、方法等結構。本文示範如何利用反射掃描實作特定介面的類別,動態載入外掛,實現彈性的外掛架構。
<?php
interface IPlugin {
public static function getName();
// 可選擇性實作
// public static function getMenuItems();
// public static function getArticles();
}
?>
<?php
function findPlugins(): array {
$plugins = [];
foreach (get_declared_classes() as $className) {
$refClass = new ReflectionClass($className);
if ($refClass->implementsInterface('IPlugin')) {
$plugins[] = $refClass;
}
}
return $plugins;
}
function computeMenu(): array {
$menu = [];
foreach (findPlugins() as $plugin) {
if ($plugin->hasMethod('getMenuItems')) {
$method = $plugin->getMethod('getMenuItems');
$items = $method->isStatic()
? $method->invoke(null)
: $method->invoke($plugin->newInstance());
$menu = array_merge($menu, $items);
}
}
return $menu;
}
function computeArticles(): array {
$articles = [];
foreach (findPlugins() as $plugin) {
if ($plugin->hasMethod('getArticles')) {
$method = $plugin->getMethod('getArticles');
$items = $method->isStatic()
? $method->invoke(null)
: $method->invoke($plugin->newInstance());
$articles = array_merge($articles, $items);
}
}
return $articles;
}
?>
<?php
class MyCoolPlugin implements IPlugin {
public static function getName(): string {
return 'MyCoolPlugin';
}
public static function getMenuItems(): array {
return [
['description' => 'MyCoolPlugin', 'link' => '/MyCoolPlugin']
];
}
public static function getArticles(): array {
return [
['path' => '/MyCoolPlugin', 'title' => 'This is a really cool article', 'text' => 'xxxxxxxxx']
];
}
}
// 執行測試
$menu = computeMenu();
$articles = computeArticles();
print_r($menu);
print_r($articles);
?>
App\Plugins),掃描時可過濾命名空間前綴。findPlugins() 讀取設定決定載入哪些類別。反射讓 PHP 擁有動態擴充能力,配合介面規範即可建立乾淨的外掛系統。此架構廣泛應用於 CMS、框架模組載入等場景。希望本文對您的 PHP 程式設計有所幫助。