php利用反射实现插件机制的方法

yipeiwu_com7年前PHP代码库

本文实例讲述了php利用反射实现插件机制的方法。分享给大家供大家参考。具体实现方法如下:

复制代码 代码如下:
<?php
/**
 * @name    PHP反射API--利用反射技术实现的插件系统架构
 */  
interface Iplugin{  
    public static function getName();  
}  
function findPlugins(){  
    $plugins = array();  
    foreach (get_declared_classes() as $class){  
        $reflectionClass = new ReflectionClass($class);  
        if ($reflectionClass->implementsInterface('Iplugin')) {  
            $plugins[] = $reflectionClass;  
        }  
    }  
    return $plugins;  
}  
function computeMenu(){  
    $menu = array();  
    foreach (findPlugins() as $plugin){  
        if ($plugin->hasMethod('getMenuItems')) {  
            $reflectionMethod = $plugin->getMethod('getMenuItems');  
            if ($reflectionMethod->isStatic()) {  
                $items = $reflectionMethod->invoke(null);  
            } else {  
                $pluginInstance = $plugin->newInstance();  
                $items = $reflectionMethod->invoke($pluginInstance);  
            }  
            $menu = array_merge($menu,$items);  
        }  
    }  
    return $menu;  
}  
function computeArticles(){  
    $articles = array();  
    foreach (findPlugins() as $plugin){  
        if ($plugin->hasMethod('getArticles')) {  
            $reflectionMethod = $plugin->getMethod('getArticles');  
            if ($reflectionMethod->isStatic()) {  
                $items = $reflectionMethod->invoke(null);  
            } else {  
                $pluginInstance = $plugin->newInstance();  
                $items = $reflectionMethod->invoke($pluginInstance);  
            }  
            $articles = array_merge($articles,$items);  
        }  
    }  
    return $articles;  
}  
class MycoolPugin implements Iplugin {  
    public static function getName(){  
        return 'MycoolPlugin';  
    }  
    public static function getMenuItems(){  
        return array(array('description'=>'MycoolPlugin','link'=>'/MyCoolPlugin'));  
    }  
    public static function getArticles(){  
        return array(array('path'=>'/MycoolPlugin','title'=>'This is a really cool article','text'=> 'xxxxxxxxx' ));  
    }  
}
$menu = computeMenu();  
$articles    = computeArticles();  
print_r($menu);  
print_r($articles);

希望本文所述对大家的php程序设计有所帮助。

相关文章

php验证码的制作思路和实现方法

php验证码的制作思路和实现方法

一、制作思路 由于注册的时候常常会用到注册码来防止机器恶意注册,这里我发表一个产生png图片验证码的基本图像,简单的思路分析: 1、产生一张png的图片 2、为图片设置背景色 3、设置...

php中序列化与反序列化详解

把复杂的数据类型压缩到一个字符串中 serialize() 把变量和它们的值编码成文本形式 unserialize() 恢复原先变量 eg: $stooges = array('Mo...

PHP中遇到的时区问题解决方法

最近在学习PHP过程中发现PHP中的格式化时间戳比北京时间晚了8个小时,上网搜索发现原来是时区不对,解决办法是:      1、永久修改 &nb...

解决Yii2邮件发送结果返回成功,但接收不到邮件的问题

前言 本文主要介绍的是关于解决Yii2邮件发送返回成功但接收不到邮件问题的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 刚刚用了一下yii邮件发送功能,虽然结果返回成功,但接...

解决phpmyadmin中文乱码问题。。。

解决phpmyadmin中文乱码问题。。。 去phpMyAdmin的根目录下,打开以下这个文件: libraries/select_lang.lib.php    1、找到有"zh-gb...