反射查找插件

<?php
echo ‘<pre>‘;

//定义一个测试反射的类
class CQH
{
    public $name = ‘cqh‘;
    private $country= ‘china‘;
    const gender = ‘man‘;
    public function say()
    {
        echo ‘hello,world‘;
    }
    private function eat()
    {
        echo ‘eat‘;
    }
    public static function drink()
    {
        echo ‘drink‘;
    }
}

/*  //打印所有的反射接口
    Reflection::export(new ReflectionExtension(‘reflection‘)); */

/*  //反射创建所有的PHP类的导出结果,get_declared_classes可以获取所有已声明的类
    foreach(get_declared_classes() as $class)
    {
        Reflection::export(new ReflectionClass($class));
    } */

/*  //只反射用户自己定义的类
    foreach(get_declared_classes() as $class)
    {
        $reflectionClass = new ReflectionClass($class);
        if($reflectionClass->isUserDefined())
        {
            Reflection::export($reflectionClass);
        }
    } */

    /********************************使用反射查找插件********************************/
	//定义一个接口
    interface IPlugin
    {
        public static function getName();
    }

    //查到所有实现了IPlugin接口的类
    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 $plugins)
        {
            $reflectionMethod = $plugins->getMethod(‘getMenuItems‘);
            if($reflectionMethod->isStatic())
            {
                $items = $reflectionMethod->invoke(null);
            }
            else
            {
                //如果这个方法不是静态的,我们需要一个实例
                $pluginsInstance = $plugins->newInstance();
                $items = $reflectionMethod->invoke($pluginsInstance);
            }
            $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;
    }
    //确定侧边栏的的类的成员
    function computeSidebars()
    {
        $sidebars = array();
        foreach(findPlugins() as $plugin)
        {
            if($plugin->hasMethod(‘getSidebars‘))
            {
                $reflectionMethod = $plugin->getMethod(‘getSidebars‘);
                if($reflectionMethod->isStatic())
                {
                    $items = $reflectionMethod->invoke(null);
                }
                else
                {
                    $pluginInstance = $plugin->newInstance();
                    $items = $reflectionMethod->invoke($pluginInstance);
                }
                $sidebars = array_merge($sidebars,$items);
            }
        }
        return $sidebars;
    }
    //创建一个实现了Iplugin接口的类
    class MyCoolPlugin 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‘ => ‘This article is cool because...‘
            ));
        }
    }

    $menu = computeMenu();
    $sidebars = computeSidebars();
    $articles = computeArticles();
    print_r($menu);
    print_r($sidebars);
    print_r($articles);

    echo ‘</pre>‘;
?>
时间: 2024-10-14 16:31:37

反射查找插件的相关文章

c# 反射与插件(插件的制作与应用 实现的流程)

=================插件实施与应用基本流程 1,开发此程序的人 提供接口(提供DLL) 2,第三方开发团队(开发插件)严格按照接口,实现功能.并打包成DLL 3,使用者下载第三方开发团队开发出来的插件,并把查询复制到程序相应的文件夹里 =================程序开发思想 1,在程序中创建一个类库,在内库中定义一个接口 2,第三方开发团队拿到接口,并是实现其功能.打包成dll文件 3,copy第三方团队开发的dll到程序指定的目录 4,找到dll存放的路径 5,遍历所有d

日期查找插件

<html><head><title>日期查找插件</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></head><!--------------------------------><body bgcolor="#fef4d9" onLoad="

PHP反射查找自定义函数

在PHP中,通过反射,可以方便地查找某个自定义函数所在的文件名,便于调试.同时还能得到该函数需要 传递的参数. Reflection::export 直接上代码: <?php $funcName="SafeHtml"; //要查找的函数名 Reflection::export(new ReflectionFunction($funcName));//直接显示 //写入文件 $str = Reflection::export(new ReflectionFunction($func

C#使用反射开发插件

当开发插件的时候需要用到反射,在客户端动态加载遍历程序集,并调用每个程序集的方法. 创建一个控制台应用程序,首先设计一个接口: public interface ISay { void SaySth(); } 在控制台应用程序下创建Plugins文件夹,控制台的可执行文件和所有程序集文件都生成在这里.右键控制台项目--"属性"--"生成",把"输出路径"设置成Plugins文件夹. 创建类库项目Assembly1,添加对控制台项目的引用,并创建实

文件内查找插件FindinFiles

FindInFiles for Windows 今天分享一个不错的插件工具:FindInFiles.如其名,其功能和Visual Studio的Ctrl+H快捷键类似,方便Windows使用者在资源管理器中进行文件内查找操作.可通过官网下载安装,安装后右键文件夹,会在右键菜单中显示"FIndinfiles..."菜单,点击打开查找对话框进行文件内查找. 主要特性: - 根据文件上下文内容进行全搜索. - 自动检测文件类型(UTF8, UNICODE, EUC-KR, EUC-JP, I

插件化—通过反射调用插件的函数

1 package com.zyhitheima.plugindemo; 2 import java.lang.reflect.Method; 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.List; 6 import java.util.Map; 7 8 import dalvik.system.PathClassLoader; 9 10 import android.os.Bundle

通过反射查找泛型的属性值

import java.lang.reflect.Field public <T> void set(){ List<T> list=new ArrayList<T>(); String name="",value=""; for(T t:list){ Class c = t.getClass(); Field[] fs = c.getDeclaredFields(); for(Field temp:fs){ try { temp

类型查找器 ITypeFinder

NopCommerce为了支持插件功能,以及支持一些自动注册的功能.系统提供了类型查找器.ITypeFinder以及实现类就是提供此功能.通过类型查找器可以查找本程序域中的类,也可以查找整个bin目录下所有动态链接库中类,并把它们注册到类型反转容器中.ITypeFinder以及实现类如下: ITypeFinder接口 /// <summary> /// Classes implementing this interface provide information about types ///

android--动态加载、插件化

需求驱动 随着业务发展需要和无线部门的拆分,各业务产品模块归属到各业务BU,原有无线App开发团队被分为基础框架.业务A.业务B.业务C等多个开发团队,从此App的开发和发布进入了一个全新模式.在这种模式下,开发沟通成本大大提高,之前的协作模式难以为继,需要新的开发模式和技术解决需求问题. 另一方面,从技术上来说65535方法数问题.旧方案是把所有第三方库放到第二个dex中,并且利用Facebook当年发现的hack方法扩大点LinearAllocHdr分配空间(5M提升到8M),但随着代码的膨