反射
面向对象编程中对象被赋予了自省的能力,而这个自省的过程就是反射。
反射,直观理解就是根据到达地找到出发地和来源。比如,一个光秃秃的对象,我们可以仅仅通过这个对象就能知道它所属的类、拥有哪些方法。
反射是指在PHP运行状态中,扩展分析PHP程序,导出或提出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取信息以及动态调用对象方法的功能称为反射API。
在平常开发中,用到反射的地方不多:一个是对对象进行调试,另一个是获取类的信息。在MVC和插件开发中,使用反射很常见,但是反射的消耗也很大,在可以找到替代方案的情况下,就不要滥用。
PHP有Token函数,可以通过这个机制实现一些反射功能。从简单灵活的角度讲,使用已经提供的反射API是可取的。
很多时候,善用反射能保持代码的优雅和简洁,但反射也会破坏类的封装性,因为反射可以使本不应该暴露的方法或属性被强制暴露了出来,这既是优点也是缺点
反射API提供的常用类和函数:
下面提供的函数是常用的函数,不是全部,有的函数根本用不到,想看全部的可以到网上搜一下,比较多。提供的这组方法没有必要背下来,用到的时候可以查看。
1:Reflection public static export(Reflector r [,bool return])//打印类或方法的详细信息 public static getModifierNames(int modifiers) //取得修饰符的名字 2:ReflectionMethod: public static string export() //打印该方法的信息 public mixed invoke(stdclass object, mixed* args) //调用对应的方法 public mixed invokeArgs(stdclass object, array args)//调用对应的方法,传多参数 public bool isFinal() //方法是否为final public bool isAbstract() //方法是否为abstract public bool isPublic() //方法是否为public public bool isPrivate() //方法是否为private public bool isProtected() //方法是否为protected public bool isStatic() //方法是否为static public bool isConstructor() //方法是否为构造函数 3:ReflectionClass: public static string export() //打印类的详细信息 public string getName() //取得类名或接口名 public bool isInternal() //类是否为系统内部类 public bool isUserDefined() //类是否为用户自定义类 public bool isInstantiable() //类是否被实例化过 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() //测试该类是否为抽象类 4:ReflectionParameter: public static string export() //导出该参数的详细信息 public string getName() //取得参数名 public bool isPassedByReference() //测试该参数是否通过引用传递参数 public ReflectionClass getClass() //若该参数为对象,返回该对象的类名 public bool isArray() //测试该参数是否为数组类型 public bool allowsNull() //测试该参数是否允许为空 public bool isOptional() //测试该参数是否为可选的,当有默认参数时可选 public bool isDefaultValueAvailable() //测试该参数是否为默认参数 public mixed getDefaultValue() //取得该参数的默认值 5:ReflectionExtension类 public static export() //导出该扩展的所有信息 public string getName() //取得该扩展的名字 public string getVersion() //取得该扩展的版本 public ReflectionFunction[] getFunctions() //取得该扩展的所有函数 public array getConstants() //取得该扩展的所有常量 public array getINIEntries() //取得与该扩展相关的,在php.ini中的指令信息