岳阳网站项目建设报道,婚纱摄影哪家好,wordpress功能小工具增加按钮,百度一下百度首页PHP5 具有完整的反射API#xff0c;添加对类、接口、函数、方法和扩展进行反向工程的能力。 反射是什么#xff1f; 它是指在PHP运行状态中#xff0c;扩展分析PHP程序#xff0c;导出或提取出关于类、方法、属性、参数等的详细信息#xff0c;包括注释。这种动态获取的信…PHP5 具有完整的反射API添加对类、接口、函数、方法和扩展进行反向工程的能力。 反射是什么 它是指在PHP运行状态中扩展分析PHP程序导出或提取出关于类、方法、属性、参数等的详细信息包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。反射是操纵面向对象范型中元模型的API其功能十分强大可帮助我们构建复杂可扩展的应用。 其用途如自动加载插件自动生成文档甚至可用来扩充PHP语言。 PHP反射api由若干类组成可帮助我们用来访问程序的元数据或者同相关的注释交互。借助反射我们可以获取诸如类实现了那些方法创建一个类的实例不同于用new创建调用一个方法也不同于常规调用传递参数动态调用类的静态方法。反射api是PHP内建的OOP技术扩展包括一些类异常和接口综合使用他们可用来帮助我们分析其它类接口方法属性方法和扩展。这些OOP扩展被称为反射。 平常我们用的比较多的是 ReflectionClass类 和 ReflectionMethod类例如 代码如下: ?php
class Person {/*** For the sake of demonstration, were setting this private*/private $_allowDynamicAttributes false;/*** typeprimary_autoincrement*/protected $id 0;/*** typevarchar length255 null*/protected $name;/*** typetext null*/protected $biography;public function getId() {return $this-id;}public function setId($v) {$this-id $v;}public function getName() {return $this-name;}public function setName($v) {$this-name $v;}public function getBiography() {return $this-biography;}public function setBiography($v) {$this-biography $v;}
} View Code 一、通过ReflectionClass我们可以得到Person类的以下信息 1.常量 Contants2.属性 Property Names3.方法 Method Names静态4.属性 Static Properties5.命名空间 Namespace6.Person类是否为final或者abstract7.Person类是否有某个方法 接下来反射它只要把类名Person传递给ReflectionClass就可以了 代码如下: $class new ReflectionClass(Person); // 建立 Person这个类的反射类
$instance $class-newInstanceArgs($args); // 相当于实例化Person 类 1获取属性(Properties) 代码如下: $properties $class-getProperties();
foreach ($properties as $property) {echo $property-getName() . \n;
}
// 输出:
// _allowDynamicAttributes
// id
// name
// biography 默认情况下ReflectionClass会获取到所有的属性private 和 protected的也可以。如果只想获取到private属性就要额外传个参数 代码如下: $private_properties $class-getProperties(ReflectionProperty::IS_PRIVATE); 可用参数列表 代码如下: ReflectionProperty::IS_STATIC
ReflectionProperty::IS_PUBLIC
ReflectionProperty::IS_PROTECTED
ReflectionProperty::IS_PRIVATE 通过$property-getName()可以得到属性名。 2获取注释 通过getDocComment可以得到写给property的注释。 代码如下: foreach ($properties as $property) {if ($property-isProtected()) {$docblock $property-getDocComment();preg_match(/ type\([a-z_]*) /, $property-getDocComment(), $matches);echo $matches[1] . \n;}
}
// Output:
// primary_autoincrement
// varchar
// text 3获取类的方法 代码如下: getMethods() 来获取到类的所有methods。
hasMethod(string) 是否存在某个方法
getMethod(string) 获取方法 4执行类的方法 代码如下: $instance-getName(); // 执行Person 里的方法getName
// 或者
$method $class-getmethod(getName); // 获取Person 类中的getName方法
$method-invoke($instance); // 执行getName 方法
// 或者
$method $class-getmethod(setName); // 获取Person 类中的setName方法
$method-invokeArgs($instance, array(snsgou.com)); 二、通过ReflectionMethod我们可以得到Person类的某个方法的信息 1.是否“public”、“protected”、“private” 、“static”类型2.方法的参数列表3.方法的参数个数4.反调用类的方法 代码如下: // 执行detail方法
$method new ReflectionMethod(Person, test);if ($method-isPublic() !$method-isStatic()) {echo Action is right;
}
echo $method-getNumberOfParameters(); // 参数个数
echo $method-getParameters(); // 参数对象数组 ----- 转载于:https://www.cnblogs.com/KeenLeung/p/6041280.html