反射机制简介

  1. 之前已经介绍过Java反射机制的简单使用,所有的反射机制的思想作用等都是类似的,下面就一起来了解一下PHP反射机制。
  2. 个人理解:反射机制就是可以利用类名或者一个类的对象来获取关于这个类的一系列信息(类的变量,方法),然后又就可以利用得到的类的信息实例化一些类的对象
  3. 官方给的简介:反射 API,有 对类、接口、函数、方法和扩展进行反向工程的能力。 此外,反射 API 提供了方法来取出函数、类和方法中的文档注释。
  4. 一般在框架中使用到反射机制比较多(控制反转),正常情况下一般使用不到反射的

反射机制的使用

  1. 常用的类

    1. ReflectionClass 通过类名获取类的信息
    2. ReflectionObject 通过类的对象获取类的信息
  2. 代码,还以之前介绍Java反射的Worker类为例

    worker.php:

    <?php
    
     class Worker{
    //工人的一些属性
    private $name_;
    private $age_;
    private $salary_; //构造方法
    public function __construct($name,$age,$salary){
    $this->name_ = $name;
    $this->age_ = $age;
    $this->salary_ = $salary;
    }
    //输出工人信息的方法
    public function show(){
    echo "年龄".$this->salary_;
    echo "姓名".$this->name_;
    echo "工资".$this->salary_;
    } //__toString方法
    public function __toString(){
    return "年龄:".$this->age.",姓名:".$this->name."工资:".$this->salary;
    } }

    下面可以通过反射机制获取类的信息

    注 getObjectOfRuntimeClass.php 该文件和worker.php 在一个文件夹下

    <?php
    include 'worker.php';
    //通过类名获取
    $workClass_by_classname = new ReflectionClass('Worker'); //通过类的实例对象获取
    $w = new Worker("小明",20,20);
    $workerClass_by_classinstance = new ReflectionObject($w); //因为ReflectionObject是ReflectionClass的子类,所以workClass_by_classname的方法,workerClass_by_classinstance同样适用
    //下面利用workClass_by_classname对象获取类的一些属性
    //获取类名
    echo $workClass_by_classname->getName();
    //获取类的方法列表
    var_dump($workClass_by_classname->getMethods());
    //获取类的属性
    var_dump($workClass_by_classname->getProperties()); //利用反射得到方法,并执行该方法
    $worker = $workClass_by_classname->newInstance("小明",20,20);
    $show_method = new ReflectionMethod('Worker','show');
    $show_method->invoke($worker); //利用反射机制得到属性,并设置值
    $property = $workClass_by_classname->getProperty('name_');
    $property->setAccessible(true);
    var_dump($property->getValue($worker)); $property->setValue($worker ,'小红');
    var_dump($property->getValue($worker));

    除了这些外,PHP反射还有其他的功能,具体可参考PHP手册的反射部分

    如需转载请注明出处:http://www.cnblogs.com/zhuchenglin/p/8890451.html

最新文章

  1. android环境下的即时通讯
  2. Uva11464 Even Parity
  3. IPC
  4. 用飞信监控GoldenGate进程
  5. Oracle 客户端配置
  6. DNS为什么通常都会设置为14.114.114.114
  7. ShareSDK for iOS 2.9.0已经公布
  8. JavaScript-学习一_var
  9. Sublime 学习记录(五) Sublime 其他插件(个人喜好)
  10. ASP.NET MVC4 json序列化器
  11. hdu2612(bfs)
  12. 惊人go语言(image网站开发)
  13. 关于在jsp中的路径问题
  14. 结对编程作业——四则运算GUI程序
  15. 用less编写百度搜索静态效果
  16. Python字符串拼接的6种方法(转)
  17. 全局(Global) 与本地(Local)索引的区别
  18. Android毛玻璃模糊化效果处理
  19. 一小段测试atof的代码
  20. codevs1735 方程的解数(meet in the middle)

热门文章

  1. 使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium)
  2. Mock.js简易教程,脱离后端独立开发,实现增删改查功能(转)
  3. web文件下载
  4. spring+myBatis 配置多数据源,切换数据源
  5. sortable.js 拖拽排序及配置项说明
  6. syntax error near unexpected token `do(写的shell脚本出现格式问题)---&gt;1.问题2.展示信息3.解决方案
  7. MySQL/Oracle数据库优化总结
  8. 集腋成裘-13-git使用-02进阶篇
  9. 【转】vscode调试运行c#详细操作过程
  10. Chrome插件触发web页面的事件