PHP反射机制详解以及插件架构实现

1。用途:
该扩展分析php程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。
Reflection可以说是对php库函数:“Classes/Objects 类/对象函数”的一个扩展。
主要用在通过程序检测现有php程序内部关于类、方法等信息,并做出处理。

2。API概览:

class Reflection { }
interface Reflector { }
class ReflectionException extends Exception { }
class ReflectionFunction implements Reflector { }
class ReflectionParameter implements Reflector { }
class ReflectionMethod extends ReflectionFunction { }
class ReflectionClass implements Reflector { }
class ReflectionObject extends ReflectionClass { }
class ReflectionProperty implements Reflector { }
class ReflectionExtension implements Reflector { }


3。详细说明:(例子详见php手册)
①Reflection类


②ReflectionException类

该类继承标准类,没特殊方法和属性。

③ReflectionFunction类


④ReflectionParameter类:


⑤ReflectionClass类:

getModifiers())进一步读取
    public bool isInstance(stdclass object)
    //测试传入的对象是否为该类的一个实例
    public stdclass newInstance(mixed* args)
    //创建该类实例
    public ReflectionClass getParentClass()
    //取得父类
    public bool isSubclassOf(ReflectionClass class)
    //测试传入的类是否为该类的父类
    public array getStaticProperties()
    //取得该类的所有静态属性
    public mixed getStaticPropertyValue(string name [, mixed default])
    //取得该类的静态属性值,若private,则不可访问
    public void setStaticPropertyValue(string name, mixed value)
    //设置该类的静态属性值,若private,则不可访问,有悖封装原则
    public array getDefaultProperties()
    //取得该类的属性信息,不含静态属性
    public bool isIterateable()
    public bool implementsInterface(string name)
    //测试是否实现了某个特定接口
    public ReflectionExtension getExtension()
    public string getExtensionName()
}
?>

⑥ReflectionMethod类:


⑦ReflectionProperty类:


⑧ReflectionExtension类


4。附:

其实从第二点API概览可以看出:接口挺好用的。
一方面Reflector接口为Reflection小系统提供了一个很好的接口命名规范,
每个实现他的类都须按他的规范,从外部看来,这个小系统API很统一。
另一方面由于很多类实现了Reflector接口,
在这样的类层次结构中,若想实现多态是很容易的。

演示用代码如下所示:

target [] = new ClassOne ();
	}
	function __call($name, $args) {
		foreach ( $this->target as $obj ) {
			$r = new ReflectionClass ( $obj );
			if ($method = $r->getMethod ( $name )) {
				if ($method->isPublic () && ! $method->isAbstract ()) {
					return $method->invoke ( $obj, $args );
				}
			}
		}
	}
}
$obj = new ClassOneDelegator ();
$obj->callClassOne ();
?>

输出结果:
In Class One
可见,通过代理类ClassOneDelegator来代替ClassOne类来实现他的方法。
同样的,如下的代码也是能够运行的:

target [] = $obj;
	}
	function __call($name, $args) {
		foreach ( $this->target as $obj ) {
			$r = new ReflectionClass ( $obj );
			if ($method = $r->getMethod ( $name )) {
				if ($method->isPublic () && ! $method->isAbstract ()) {
					return $method->invoke ( $obj, $args );
				}
			}
		}
	}
}
$obj = new ClassOneDelegator ();
$obj->addObject ( new ClassOne () );
$obj->callClassOne ();
?>

PHP反射API–利用反射技术实现的插件系统架构

 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;
	}
	require_once ('plugin.php');
	$menu = computeMenu ();
	$articles = computeArticles ();
	print_r ( $menu );
	print_r ( $articles );
	
	// plugin.php 代码如下
	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 
					) 
			);
		}
	} 

PHP反射机制详解以及插件架构实现》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注