php之反射调用类中方法 插件架构

        今天在公司加班,项目里要用到其他的插件,为了减少代码侵入,就想用php 的反射机制应该是不错的,开始上网查资料(lz是android开发,在小公司你懂得),花了大概两个多小时完成了下面的代码。

       整体思路是:pluginM通过读取配置文件demo.ini加载插件文件,而后通过反射的方式调用指定的方法。

      pluginM文件

<?php

class pluginM extends CI_Model {
	function __construct()
	{
		parent::__construct();
	}
	
	function run($classname,$functionname,$par){
		$pluginarray =$this->get_ini_file("demo.ini");
		$classpathStr = $this->get_ini_item($pluginarray,'classpath');
		$classpatharr = explode(";",$classpathStr);
		for($i=0;$i<count($classpatharr);$i++){
			$classpath = $classpatharr[$i];
			require_once ($classpath);
		}
		
		$classnameStr=$this->get_ini_item($pluginarray,'classname');
		if(strpos($classnameStr,$classname)<0){
			echo "class  no find ";
			break;
		}
		$reflectionClass = new ReflectionClass($classname);
			$cla= $reflectionClass->newInstance();
			if(method_exists($cla, $functionname)){
				$function=	$reflectionClass->getmethod($functionname);
				$function->invoke($cla,$par);
			}
	}
	
	function get_ini_file($file_name = "demo.ini"){
		$str=file_get_contents($file_name);
		$ini_list = explode("\r\n",$str);
		$ini_items = array();
		foreach($ini_list as $item){
			$one_item = explode("=",$item);
			if(isset($one_item[0])&&isset($one_item[1]))
                             $ini_items[trim($one_item[0])] = trim($one_item[1]);
	}
		return $ini_items;
	}
	
	function get_ini_item($ini_items = null,$item_name = ''){
		if(empty($ini_items)) return "";
		else return $ini_items[$item_name];
	}
	
}

?>

配置文件 demo.ini

classname=test1,test2
classpath=application/plugin/test1.php;application/plugin/test2.php

插件测试代码 test1.php 

<?php
class test1  {
	
	function __construct()
	{
	}
	
	 function init(){
		echo "test1  init";
	}
	 function run(){
		echo "test1 run";
	}
	function sayHello($name){
		echo "test1 say hello ".$name;
	}
}

?>

 test2.php

<?php
class test2  {
	
	function __construct()
	{
	}
	
	 function init(){
		echo "test2  init";
	}
	 function run(){
		echo "test2 run";
	}
	function sayHello($name){
		echo "test2 say  hello ".$name;
	}
}

?>

反射调用

<?php

class plugin extends CI_Controller {
	function __construct(){
		parent::__construct();
		$this->load->model('pluginM');
	}
	function  index(){
		$this->pluginM->run('test2',"sayHello",' Tom');
	}
}

?>

结果 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值