• PHP 反射的简单使用


    反射机制简介

    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

  • 相关阅读:
    Django 框架篇(四) : 视图(view)详解 及 路由系统(url)
    Django 框架篇(三) : Django之模板
    Django 框架篇(二) : 创建APP之视图函数; model(模型)系统操作数据库之ORM操作;
    Django 框架篇: 一. Django介绍; 二. 安装; 三. 创建项目;
    212
    redux:applyMiddleware源码解读
    react 反模式——不使用jsx动态显示异步组件
    angular 动态组件类型
    webpack2-webpack.config.js配置
    tdd:(react + mocha)环境配置
  • 原文地址:https://www.cnblogs.com/zhuchenglin/p/8890451.html
走看看 - 开发者的网上家园