PHP 反射的简单使用
反射机制简介
- 之前已经介绍过Java反射机制的简单使用,所有的反射机制的思想作用等都是类似的,下面就一起来了解一下PHP反射机制。
- 个人理解:反射机制就是可以利用类名或者一个类的对象来获取关于这个类的一系列信息(类的变量,方法),然后又就可以利用得到的类的信息实例化一些类的对象
- 官方给的简介:反射 API,有 对类、接口、函数、方法和扩展进行反向工程的能力。 此外,反射 API 提供了方法来取出函数、类和方法中的文档注释。
- 一般在框架中使用到反射机制比较多(控制反转),正常情况下一般使用不到反射的
反射机制的使用
常用的类
- ReflectionClass 通过类名获取类的信息
- ReflectionObject 通过类的对象获取类的信息
代码,还以之前介绍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
PHP 反射的简单使用的更多相关文章
- 通过java反射实现简单的关于MongoDB的对象关系映射(ORM).
通过阅读MongoDB 3.2.1的官方文档中关于java 编程发现最新的文档并没有实现对对象到Document的映射,所以自己有了利用反射实现简单的关系映射. 1.定义抽象类:AbstractMo ...
- C#开发之反射的简单使用
奋斗的蘑菇 原文C#开发之反射的简单使用 以前在Windows Mobile中写过一个写好的Dll中的图片的例子,现在在项目中有接触到在一个大的窗体中,动态的加载一些窗体这样的需求.将功能按照模块的划 ...
- 进阶Java编程(10)反射与简单Java类
1,传统属性自动赋值弊端 简单Java类主要由属性构成,并且提供有setter与getter类,同时简单Java类最大的特征就是通过对象保存相应的类属性的内容.但是如果使用传统的简单Java类开发,那 ...
- java反射(四)--反射与简单java类
一.传统简单java类 简单的java类主要是由属性所组成,并且提供有相应的setter以及getter的处理方法,同时简单java类最大的特征就是通过对象保存相应的类的属性内容,但是如果使用传统的简 ...
- Java利用自定义注解、反射实现简单BaseDao
在常见的ORM框架中,大都提供了使用注解方式来实现entity与数据库的映射,这里简单地使用自定义注解与反射来生成可执行的sql语句. 这是整体的目录结构,本来是为复习注解建立的项目^.^ 好的,首先 ...
- [Java反射机制]用反射改进简单工厂模式设计
如果做开发的工作,工厂设计模式大概都已经深入人心了,比较常见的例子就是在代码中实现数据库操作类,考虑到后期可能会有数据库类型变换或者迁移,一般都会对一个数据库的操作类抽象出来一个接口,然后用工厂去获取 ...
- java反射机制简单实例
目录 Java反射 简单实例 @(目录) Java反射 Java语言允许通过程序化的方式间接对Class进行操作.Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通 ...
- Java反射的简单入门
1.Class的简单介绍 Class类的类表示正在运行的Java应用程序中的类和接口. 枚举是一种类,一个注解是一种接口, 每个数组也属于一个反映为类对象的类,该对象由具有相同元素类型和维数的所有数组 ...
- C#反射的简单示例
反射(Reflection)可以在运行时获 得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的名称.限定符和参数等反正说白了就 ...
随机推荐
- WPF UserControl响应窗体的PreviewKeyDown事件
目的 在UserControl页面实现通过快捷键打开新建窗口 实现过程 监听Window窗体的PreviewKeyDown 其实,使用KeyDown事件也是可以的 页面代码 <Window x: ...
- gitlab 随笔
输入: $ git init $ git add . $ git commit -m 'init commit' 绿色部分为gitlab网页的项目创建后下面的ssh路径,也可以通过查看gitlab网页 ...
- Light OJ 1085 - All Possible Increasing Subsequences
题目 link 给定一个序列, 求出上升子序列的总数. 分析 Dp[i] 表示序列 以 i 结尾的数目. 可知 Dp[i]=∑Dp[x]+1 这是一个前缀和, 用树状数组维护. Code #inclu ...
- 记录一个nginx的配置
rt #user xiaoju; worker_processes ; #error_log logs/error.log notice; #error_log logs/error.log debu ...
- phpredis扩展实现LBS距离计算和范围筛选
来源 public function geo(){ $redis = new \redis(); $redis -> connect('127.0.0.1',6379); //位置增加 $res ...
- C# 高级编程02----手动创建C#程序
在日常工作中使用C# 开发的时候,通常使用宇宙第一神器VS进行开发.为了了解编译过程,这里采用文本编辑器的方式编写一个C#程序 一.创建一个C#程序 1.使用记事本工具创建一个名为First.cs的文 ...
- 主席树套树状数组——带修区间第k大zoj2112
主席树带修第k大 https://www.cnblogs.com/Empress/p/4659824.html 讲的非常好的博客 首先按静态第k大建立起一组权值线段树(主席树) 然后现在要将第i个值从 ...
- Eclipse如何将java项目改为web项目
用Eclipse开发项目的时候,把一个Web项目导入到Eclipse里会变成了一个java工程,将无法在Tomcat中进行部署运行,那我们就要将它转换为web项目. 方法: 1.右击项目项目-属性(p ...
- import cv2出现“ImportError: DLL load failed: 找不到指定的模块”
操作系统:windows server 2008 r2 enterprise 64位 Python版本:3.7.0 64位 这个问题坑了我一天,看了不少博客,用了好多方法,也没用.不多说了,介绍我的方 ...
- ***远程连接MYSQL提示1130 - Host is not allowed to connect to this MySQL server
如果你想连接你的mysql的时候发生这个错误: ERROR 1130: Host '192.168.1.3' is not allowed to connect to this MySQL serve ...