045-利用反射机制,简单的实现PHP插件模式

<?php
//利用反射机制,简单的实现PHP插件模式
#    假设,我们有一款开源产品,所有开发者都必须在我定制的需求之上,进行二次开发,
#    而开发完成后的新模块,就是一个不一样的新插件,可以放在特定的位置进行自动加载

#这是我们的开源产品
    interface Demo{
        # 所有插件都必须实现这个方法
        public function msg();
    }

    #这是小明开发的插件-1
    class xiaoming implements Demo{
        public function msg(){
            echo ‘小明:我就静静地看着你装逼<br/>‘;
        }
    }

    #这是小李开发的插件-2
    class xiaoli implements Demo{
        public function msg(){
            echo ‘小李:我就装逼了,你能拿我咋滴?<br/>‘;
        }
    }

    #我们先搜索该插件类,并且判断它是否实现了msg方法
    function find(){
        # 定义描述插件的数组(是一个实例)
        $plugin = array();

        foreach (get_declared_classes() as  $class) {
            $reclass = new ReflectionClass($class);

            # 检测类是否继承与接口Demo
            if ($reclass->implementsInterface(‘Demo‘)) {
                $plugin[] = $reclass;
            }
        }
        return $plugin;
    }

/**
 * 编写一个监听所有插件对应的msg方法 的函数
 */
    function myexec(){
        foreach (find() as $plugin) {
            # 判断该插件是否拥有msg方法
            if($plugin->hasMethod(‘msg‘)){
                # 得到这个方法类的一个实例
                $remethod = $plugin->getMethod(‘msg‘);
                # 如果它是静态方法,则直接调用即可
                if($remethod->isStatic()){
                    $remethod->invoke(null);
                }else{
                    # 先声明插件类的一个实例,然后调用它
                    $pluins = $plugin->newInstance();
                    $remethod->invoke($pluins);
                }
            }
        }
    }

# 监听所有插件
myexec();
?>

原文地址:https://www.cnblogs.com/tianpan2019/p/10994177.html

时间: 2024-10-12 18:06:29

045-利用反射机制,简单的实现PHP插件模式的相关文章

利用反射机制,获取类的字段、方法、并实现简单调用

这篇文章是为之后要介绍Android的ICO框架做预备的,所以,如果想最近学习Android的ICO框架的同学,可以稍微看一下. 首先,简单介绍一下Java里面的反射. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 不知道这样的一段解释,你能否看懂.如果更简单的说,反射就是能够根据你给出类名实例化出一个实实在在的对象.所以,对象的实例

Android利用反射机制为实体类属性赋值

在做android项目时,有时会遇到从网络上获取json类型数据,赋值给实体类,实体类属性少可以一个一个的赋值,如果实体类有很多属性,赋值可能就要耗很长的功夫了,幸好Java给我们提供了反射机制.下面是在我在android中如何利用java反射机制给实体类赋值. 在Android中利用反射机制为实体类属性赋值,首先需要导入一下两个包 import java.lang.reflect.Field; import java.lang.reflect.Method; 给实体类赋值首先需要一个实体类,这

java中利用反射机制绕开编译器对泛型的类型限制

首先看下面这个例子 public static void main(String[] args) { ArrayList<Integer> al1 = new ArrayList<Integer>(); al1.add(1); ArrayList<String> al2 = new ArrayList<String>(); al2.add("hello"); //int型链表和string型链表,结果为true System.out.pr

NPOI操作excel——利用反射机制,NPOI读取excel数据准确映射到数据库字段

> 其实需求很明确,就是一大堆不一样的excel,每张excel对应数据库的一张表,我们需要提供用户上传excel,我们解析数据入库的功能实现. 那么,这就涉及到一个问题:我们可以读出excel的表头,但是怎么知道每个表头具体对应数据库里面的字段呢? 博主经过一段时间的思考与构思,想到一法:现在的情况是我们有excel表A,对应数据库表B,但是A与B具体属性字段的映射关系我们不知.那我们是不是可以有一个A到B的映射文件C呢? 我想,说到这,大家就很明了了... 第一步:为每张excel创建一个与

C++利用反射和简单工厂模式实现业务模块解耦

1. 业务说明 为了便于说明,举一个简单的例子.假设现在有一个项目需要建立一个和银行交互的平台,目前只接入工商银行,后续接入其他银行,每个银行的业务都有差异,报文格式可能也不一致. 这里只列举几个简要的流程,仅包括拼报文,发送报文,接收报文,解析报文,其余整体架构以及后续处理等内容省略. 2. 初步设计 创建一个银行交互类 BankOpt,包括四个函数: int setMsg(); //拼报文 int sendMsg(); //发送报文 int getMsg(); //接收报文 int pars

利用反射机制 实现 javabean 转化为 map

package com.test.entity; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.Collection; import java.util.Date; import java.util.HashMap;

java反射机制简单介绍

1.字节码.所谓的字节码就是当java虚拟机载入某个类的对象时,首先须要将硬盘中该类的源码编译成class文件的二进制代码(字节码),然后将class文件的字节码载入到内存中,之后再创建该类的对象 2.java反射的基础是Class类(注意不是小写的class),Class类实例代表着内存中的一份字节码.常见的获取Class类对象的方法例如以下(第一种为对象的方法,另外一种为类的方法): Dog dog = new Dog(); Class dogClass = dog.getClass();

利用反射机制,对对象的属性值进行自动设置

import java.lang.reflect.Method; /** * 对象的属性值自动设置,利用反射机制 */ public class AutoSet { /** * 将源对象的属性值赋值到目标对象,属性名一致,且源对象有get方法,目标对象有set方法 * @param src 源对象 * @param target 目标对象 * @return 赋值后的目标对象 */ public static Object autoGetterAndSetter(Object src, Obje

java利用反射机制判断对象的属性是否为空

java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String>(); validateMap.put("serial", "编号");validateMap.put("major", "专业"); public static <T> String validateFiledIs