PHP reflection
PHP5添加了一项新的功能:Reflection。这个功能使得程序员可以reverse-engineer class, interface,function,method and extension。通过PHP代码,就可以得到某object的所有信息,并且可以和它交互。假设有一个类Person:
01classPerson{
02/**
03*For the sake of demonstration, we"re setting this private
04*/
05private$_allowDynamicAttributes=false;
06
07/**type=primary_autoincrement */
08protected$id=0;
09
10/**type=varchar length=255 null */
11protected$name;
12
13/**type=text null */
14protected$biography;
15
16publicfunctiongetId()
17{
18return$this->id;
19}
20publicfunctionsetId($v)
21{
22$this->id=$v;
23}
24publicfunctiongetName()
25{
26return$this->name;
27}
28publicfunctionsetName($v)
29{
30$this->name=$v;
31}
32publicfunctiongetBiography()
33{
34return$this->biography;
35}
36publicfunctionsetBiography($v)
37{
38$this->biography=$v;
39}
40}
通过ReflectionClass,我们可以得到Person类的以下信息:
[*]常量 Contants
[*]属性 Property Names
[*]方法 Method Names
[*]静态属性 Static Properties
[*]命名空间 Namespace
[*]Person类是否为final或者abstract
只要把类名"Person"传递给ReflectionClass就可以了:
1$class=newReflectionClass('Person');
获取属性(Properties):
1$properties=$class->getProperties();
2foreach($propertiesas$property){
3echo$property->getName()."\n";
4}
5//输出:
6//_allowDynamicAttributes
7//id
8//name
9//biography
默认情况下,ReflectionClass会获取到所有的属性,private 和 protected的也可以。如果只想获取到private属性,就要额外传个参数:
1$private_properties=$class->getProperties(ReflectionProperty::IS_PRIVATE);
可用参数列表:
[*]ReflectionProperty::IS_STATIC
[*]ReflectionProperty::IS_PUBLIC
[*]ReflectionProperty::IS_PROTECTED
[*]ReflectionProperty::IS_PRIVATE
如果要同时获取public 和private 属性,就这样写:ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED
应该不会感觉陌生吧。
通过$property->getName()可以得到属性名,通过getDocComment可以得到写给property的注释。
01foreach($propertiesas$property){
02if($property->isProtected()){
03$docblock=$property->getDocComment();
04preg_match('/type\=(*) /',$property->getDocComment(),$matches);
05echo$matches."\n";
06}
07}
08//Output:
09//primary_autoincrement
10//varchar
11//text
有点不可思议了吧。竟然连注释都可以取到。
获取方法(methods):通过getMethods() 来获取到类的所有methods。返回的是ReflectionMethod对象的数组。不再演示。
最后通过ReflectionMethod来调用类里面的method。
01$data=array("id"=>1,"name"=>"Chris","biography"=>"Iam am a PHP developer");
02foreach($dataas$key=>$value){
03if(!$class->hasProperty($key)){
04thrownewException($key."is not a valid property");
05}
06
07if(!$class->hasMethod("get".ucfirst($key))){
08thrownewException($key."is missing a getter");
09}
10
11if(!$class->hasMethod("set".ucfirst($key))){
12thrownewException($key."is missing a setter");
13}
14
15//Make a new object to interact with
16$object=newPerson();
17
18//Get the getter method and invoke it with the value in our data array
19$setter=$class->getMethod("set".ucfirst($key));
20$ok=$setter->invoke($object,$value);
21
22//Get the setter method and invoke it
23$setter=$class->getMethod("get".ucfirst($key));
24$objValue=$setter->invoke($object);
25
26//Now compare
27if($value==$objValue){
28echo"Getteror Setter has modified the data.\n";
29}else{
30echo"Getterand Setter does not modify the data.\n";
31}
32}
有点意思吧。
页:
[1]