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

yipeiwu_com6年前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的Yii框架中进行错误和异常处理

实例讲解如何在PHP的Yii框架中进行错误和异常处理

Yii已经默认已经在CApplication上实现了异常和错误的接管,这是通过php的set_exception_handler,set_error_handler实现的。通过这两个PH...

php模板中出现空行解决方法

在本地也解决了,但是上传到服务器依然有空行,搞了一个上午,都快崩溃了,最后决定自己想办法解决,经过几个小时的摸索终于有了完美解决方法了。 运用php显示缓冲区显示原理,成功去掉 在php...

php截取后台登陆密码的代码

if($_POST[loginsubmit]!=){ //判断是否点了登陆按钮 $sb=user:.$_POST[username].--passwd:.$_POST[password]...

php扩展开发入门demo示例

本文实例讲述了php扩展开发。分享给大家供大家参考,具体如下: 一、进入php源码包,找到ext文件夹 cd /owndata/software/php-5.4.13/ext...

PHP字符串中特殊符号的过滤方法介绍

有时候我们会遇到过滤字符串中特殊字符的问题,本文提供了一个处理特殊字符串的方法,可能有遗漏,如果读者发现了可以留言告诉我,谢谢。复制代码 代码如下:function strFilter(...