反射是指在PHP的运行状态中,扩展分析php程序,导出或者提取出关于类、方法、属性、参数等详细信息,甚至包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。反射是操纵面向对象模型中元模型的API,其功能十分强大,可以帮助我们构建复杂,可扩展的应用。(ps:包括在工厂模式中的使用)
反射API是php内建的oop技术扩展,包括一些类、异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性和扩展。这些oop扩展被称为反射。
ReflectionClass
- <?php
- class ReflectionClass implements Reflector
- {
- final private __clone()
- public object __construct(string name)
- public string __toString()
- public static string export()
- //导出该类的详细信息
- public string getName()
- //取得类名或接口名
- public bool isInternal()
- //测试该类是否为系统内部类
- public bool isUserDefined()
- //测试该类是否为用户自定义类
- public bool isInstantiable()
- //测试该类是否被实例化过
- public bool hasConstant(string name)
- //测试该类是否有特定的常量
- public bool hasMethod(string name)
- //测试该类是否有特定的方法
- public bool hasProperty(string name)
- //测试该类是否有特定的属性
- public string getFileName()
- //取得定义该类的文件名,包括路径名
- public int getStartLine()
- //取得定义该类的开始行
- public int getEndLine()
- //取得定义该类的结束行
- public string getDocComment()
- //取得该类的注释
- public ReflectionMethod getConstructor()
- //取得该类的构造函数信息
- public ReflectionMethod getMethod(string name)
- //取得该类的某个特定的方法信息
- public ReflectionMethod[] getMethods()
- //取得该类的所有的方法信息
- public ReflectionProperty getProperty(string name)
- //取得某个特定的属性信息
- public ReflectionProperty[] getProperties()
- //取得该类的所有属性信息
- public array getConstants()
- //取得该类所有常量信息
- public mixed getConstant(string name)
- //取得该类特定常量信息
- public ReflectionClass[] getInterfaces()
- //取得接口类信息
- public bool isInterface()
- //测试该类是否为接口
- public bool isAbstract()
- //测试该类是否为抽象类
- public bool isFinal()
- //测试该类是否声明为final
- public int getModifiers()
- //取得该类的修饰符,返回值类型可能是个资源类型
- //通过Reflection::getModifierNames($class->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()
- }
- ?>
工厂模式应用:
- class MoveDataFactory
- {
- /**
- * Description:简单工厂模式,根据mode选取不同实例化对象
- * @return 对象实例
- */
- public function GetMoveClass($classname)
- {
- $reflectionclass = new ReflectionClass($classname);
- return $reflectionclass->newInstance();
- }
- }