PHP 5 具有完整的反射 API,可以通过反射机制来获取类,接口,函数的详细信息。例如可以通过反射api的成员属性,成员方法,命名空间的名称,检测某个类是否为抽象类等操作。(欢迎指点)

一般用途是在框架中配合自动加载类来完成 对类的实例化操作。

  1.建立一个Person类的反射类,然后实例化此类。

<?php
class Person {
/**
* demo
*/
private $_allowDynamicAttributes = false; /** demo*/
public $id = 0; /** demo */
protected $name = 'lemon'; /** demo */
protected $biography; public function getName()
{
return $this->name;
}
public function setName($v)
{
$this->name = $v;
}
} //建立 Person这个类的反射类
$class = new ReflectionClass('Person'); //相当于实例化Person 类
$instance = $class->newInstanceArgs([]);

  2.获取属性

$properties = $class->getProperties();
foreach($properties as $property) {
echo $property->getName()."\n";
}

默认情况下,getProperties会获取到所有的属性,pulbic,private,protected.如果只想获取到private属性,就要额外传个参数:

 可用参数列表:

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

3.获取方法

$methods = $class->getMethods();
foreach($methods as $method) {
echo $method->name.PHP_EOL;
}

4.执行方法

//获取Person 类中的getName方法
echo $instance->getName();
//或者
$re = $class->getmethod('getName');
echo $re->invoke($instance);

5.和自动加载类配合实例化某类

目录结构 d代表目录,f代表文件

  Reflection (d)

  Reflection6.php (f)

  loader.php (f)

  ----vendor (d)

    ----A(d)

      ----A.php (f)

Reflection6.php 文件

<?php
namespace Reflection; require 'loader.php';
call_user_func_array([new \ReflectionClass('vendor\A\A'),'newInstance'],['demo']);

 loader.php 文件

<?php
function loader($classname)
{
$fullfile = '';
if (($index = strripos($classname,'\\')) !== false){
$namespace = substr($classname,0,$index);
$classname = substr($classname,$index+1).'.php';
$fullfile = __DIR__.DIRECTORY_SEPARATOR.$namespace.DIRECTORY_SEPARATOR.$file;
$fullfile = str_replace('\\','/',$fullfile);
} if (file_exists($fullfile)) {
require $fullfile;
}
} spl_autoload_register('loader');

A.php

<?php
namespace vendor\A; class A
{
private $name = 'zc'; public function __construct()
{
echo 'this is '.func_get_args()[0];
} }

浏览器输出 this is demo.

php反射机制学习的更多相关文章

  1. JAVA反射机制—学习总结

    最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象.什么是反射机制 ...

  2. JAVA的反射机制学习笔记(二)

    上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...

  3. java反射机制学习小结

    之前一直对java的反射机制理解得很模糊,今天因为学习spring,所以花了些时间总算把它理顺了,记录一下 另外,推荐读读这篇文章,写的挺好的http://blog.csdn.net/woshixuy ...

  4. java反射机制学习笔记

    内容引用自:https://www.cnblogs.com/wkrbky/p/6201098.html https://www.cnblogs.com/xumBlog/p/8882489.html,本 ...

  5. Java反射机制——学习总结

    前几天上REST课,因为涉及到Java的反射机制,之前看过一直没有用过,有些遗忘了,周末找了些资料来重新学习,现在总结一下,加深印象. 什么是反射机制? 参考百度百科对java反射机制的定义: “JA ...

  6. Java反射机制学习与研究

    Java反射机制:可以获取正在运行时的Java对象. 1.判断运行时对象对象所属的类. 2.判断运行时对象所具有的成员变量和方法. 3.还可以调用到private方法,改变private变量的值. S ...

  7. Java反射机制学习

    Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”. 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答 ...

  8. C#反射机制学习总结

    反射的定义:审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等. Syste ...

  9. JAVA反射机制学习随笔

    JAVA反射机制是用于在运行时动态的获取类的信息或者方法,属性,也可以用来动态的生成类,由于所有类都是CLASS的子类,我们可以用一个CLASS类的实例来实例化各种类 例如: Class<?&g ...

随机推荐

  1. skopt学习之路1-函数介绍:dummy_minimize

    def dummy_minimize(func,dimensions,n_calls=100, x0=None, y0=None, random_state=None, verbose=False, ...

  2. Scrapyd发布爬虫的工具

    Scrapyd Scrapyd是部署和运行Scrapy.spider的应用程序.它使您能够使用JSON API部署(上传)您的项目并控制其spider. Scrapyd-client Scrapyd- ...

  3. css基础示例代码

    选择器 引入方式 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  4. Executor框架(一)Executor框架介绍

    Executor框架简介 Executor框架的两级调度模型   在HotSpot VM的线程模型中,Java线程被一对一映射为本地操作系统线程.Java线程启动时会创建一个本地操作系统线程:当Jav ...

  5. Coxph model Pvalue Select2

    4   1) Put summary(coxphobject) into a variable summcph <- summary(coxphobject) 2) examine it wit ...

  6. IPv4报文分片

    1:为什么需要分片 每个数据链路层协议都有自己的帧格式,在这个格式中有一个字段是"数据字段最大长度"(MTU,最大传输单元),当数据报被封装成帧时,数据报的总长度必须小于这个最大长 ...

  7. python学习笔记一和PHP的一些对比

    python和php一样是 解释性语言 php和php一样 定义变量不需要指定类型,C语言中的print函数 在python中也是适用的 python编码 适用缩进  4个空格,通常存储为UTF-8模 ...

  8. OpenACC 云水参数化方案

    ▶ 书上第十三章,用一系列步骤优化一个云水参数化方案.用于熟悉 Fortran 以及 OpenACC 在旗下的表现 ● 代码,文件较多,放在一起了 ! main.f90 PROGRAM main US ...

  9. Zabbix监控系统端口

    参考网站: https://www.cnblogs.com/nulige/p/7072019.html

  10. jenkins坑—— shell 命令返回空导致构建失败

    今天用jenkins做CI遇到个坑,命令为:isSnapshot=`ls|grep isv-osp-service|grep -i snapshot` ls命令返回空的话,Jenkins构建就直接失败 ...