工厂模式-PHP的反射机制-阿里云开发者社区

开发者社区> 航空母舰> 正文

工厂模式-PHP的反射机制

简介:
+关注继续查看

通过PHP代码,就可以得到某object的所有信息,并且可以和它交互反射api是php内建的oop技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些oop扩展被称为反射。
通过ReflectionClass,我们可以得到Person类的以下信息:

  1. 常量Contants
  2. 属性 Property Names
  3. 方法 Method Names静态
  4. 属性 Static Properties
  5. 命名空间 Namespace
  6. Person类是否为final或者abstract
Java代码  收藏代码
  1. <?php  
  2. class Person  
  3. {  
  4.     /** 
  5.      * For the sake of demonstration, we"re setting this private 
  6.      */  
  7.     private $_allowDynamicAttributes = false;  
  8.   
  9.     /** type=primary_autoincrement */  
  10.     protected $id = 0;  
  11.   
  12.     /** type=varchar length=255 null */  
  13.     protected $name;  
  14.   
  15.     /** type=text null */  
  16.     protected $biography;  
  17.   
  18.     public function getId()  
  19.     {  
  20.         return $this->id;  
  21.     }  
  22.   
  23.     public function setId($v)  
  24.     {  
  25.         $this->id = $v;  
  26.     }  
  27.   
  28.     public function getName()  
  29.     {  
  30.         return $this->name;  
  31.     }  
  32.   
  33.     public function setName($v)  
  34.     {  
  35.         $this->name = $v;  
  36.     }  
  37.   
  38.     public function getBiography()  
  39.     {  
  40.         return $this->biography;  
  41.     }  
  42.   
  43.     public function setBiography($v)  
  44.     {  
  45.         $this->biography = $v;  
  46.     }  
  47. }  

 接下来反射它,只要把类名"Person"传递给ReflectionClass就可以了:

Java代码  收藏代码
  1. <?php  
  2. $class = new ReflectionClass('Person'); //建立Person这个类的反射类  
  3. $instance = $class->newInstanceArgs();//相当于实例化Person类  

1)获取属性(Properties)

Java代码  收藏代码
  1. <?php  
  2. $properties = $class->getProperties();  
  3. foreach ($properties as $property) {  
  4.     echo $property->getName() . "\n";  
  5. }  
  6. // 输出:  
  7. // _allowDynamicAttributes  
  8. // id  
  9. // name  
  10. // biography  

默认情况下,ReflectionClass会获取到所有的属性,private 和 protected的也可以。如果只想获取到private属性,就要额外传个参数:

Java代码  收藏代码
  1. $private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);  

可用参数列表:

  • ReflectionProperty::IS_STATIC
  • ReflectionProperty::IS_PUBLIC
  • ReflectionProperty::IS_PROTECTED
  • ReflectionProperty::IS_PRIVATE

如果要同时获取public 和protected属性,就这样写:ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED。

2)获取注释

 通过getDocComment可以得到写给property的注释。

Java代码  收藏代码
  1. <?php  
  2. foreach ($properties as $property) {  
  3.     if ($property->isProtected()) {  
  4.         $docblock = $property->getDocComment();  
  5.         preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches);  
  6.         echo $matches[1] . "\n";  
  7.     }  
  8. }  
  9. // Output:  
  10. // primary_autoincrement  
  11. // varchar  
  12. // text  

3)获取类的方法

获取方法(methods):通过getMethods() 来获取到类的所有methods。

4)执行类的方法:

Java代码  收藏代码
  1. <?php  
  2. $instance->getName(); //执行Person里的方法getName  
  3. //或者:  
  4. $ec = $class->getmethod('getName'); //获取Person 类中的getName方法  
  5. $ec->invoke($instance); //执行getName 方法  

 555

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
2916 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4518 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
9445 0
PHP的反射机制
PHP的反射机制 分类: PHP2012-03-15 15:56 13537人阅读 评论(3) 收藏 举报 phppropertiesfunctionmethods扩展api   目录(?)[+]   介绍: PHP5添加了一项新的功能:Reflection。
776 0
PHP设计模式——简单工厂
      声明:本系列博客参考资料《大话设计模式》,作者程杰。         前面两节内容介绍了什么是设计模式以及六大原则,相信看完前两节内容大家对设计模式已经有了初步的认识,接下来说一下设计模式的分类。
891 0
阿里云服务器远程登录用户名和密码的查询方法
阿里云服务器远程连接登录用户名和密码在哪查看?阿里云服务器默认密码是什么?云服务器系统不同默认用户名不同
482 0
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
3882 0
+关注
514
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载